【发布时间】:2021-04-13 06:17:07
【问题描述】:
想了解Comparator类的方法comparing的定义。我会留下一些代码,以防它有助于解释。我正在使用一个名为 Person 的类,它基本上存储了一个名字和一个姓氏。可以使用 get 方法检索此数据。
public class Person {
private final String name;
private final String lastname;
public Person(String name, String lastname) {
this.name = name;
this.lastname = lastname;
}
public String getName() { return name; }
//...
}
然后我创建了一个人员列表:
List<Person> list = Arrays.asList(
new Person("Juan", "García"),
new Person("Ana", "Martínez"),
...
);
我一直在测试对此人员列表进行排序的不同方法。在其他可能性中,我发现了这个:
list.sort(Comparator.comparing(Person::getName));
我了解这些行的作用。基本上,这个列表是使用比较器排序的,比较器使用排序键(人名)进行比较。此类键是使用对属于 Person 类的 getName 方法的引用来提取的。
不过,我也想了解幕后发生的事情。我的问题是comparing 方法。 Java 文档定义了这样的方法:
static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
特别是,我正在为泛型类型定义而苦苦挣扎:<T,U extends Comparable<? super U>>;以及参数类型的定义:Function<? super T,? extends U>
T 表示比较器类型,而U 表示键类型,对吧?那么...为什么U 需要扩展Comparable<? super U>,而后者又使用U 的任何超类?
在参数中,该函数使用属于T 的任何超类的对象并返回属于U (<? super T,? extends U>) 的任何子类的对象,但是......为什么?
我希望我的疑问是明确的。另外,对于冗长的解释感到抱歉。
【问题讨论】:
-
you 认为方法的签名应该是什么样的?知道这一点可能会让我清楚你的困惑在哪里。
-
@Sweeper 我不太擅长泛型,还在学习中。无论如何,我的逻辑是这样的:静态 super T, U> Comparator
comparison(Function super T, ? extends U> keyExtractor) 它返回一个 T 类型的 Comparator,但它也可以是一个子类,对吧?但是,我想我有点理解函数 (Function super T, ? extends U> keyExtractor) 的定义。但我不确定。
标签: java generics methods lambda comparator