在java.util.Collections内部,我们具有以下方法签名
public static <T> void sort(List<T> list, Comparator<? super T> c)
我不明白为什么要指定
Comparator<? super T>
代替
Comparator<T>
它涵盖哪些用例?
答案 0 :(得分:1)
这里是一个例子:
class Person {}
class Student extends Person {}
? super T
表示?
是T
的超类(或接口)。
也就是说,如果比较器是Comparator<Person>
,则由于Student
是从Person
继承的,因此该比较器仍应在Student
上工作。
List<Student> students = ...
Collections.sort(students, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
// compare person
return 0;
}
});
如果将Comparator<? super T>
更改为Comparator<T>
,则以上代码将无法编译。
答案 1 :(得分:0)
Batch.manufactured_on_zone_a
这些签名之所以不同,是因为它们对T的类型和T的定义中Comparable的类型参数之间的关系提出了不同的要求。
例如,假设您拥有此类:
// A
public static <T extends Comparable<? super T>> void sortA(List<T> list)
// B
public static <T extends Comparable<T>> void sortB(List<? extends T> list)
那么就拥有
class A implements Comparable<Object> { ... }
sortA失败的原因是,没有类型T既可以与其自身进行比较,又不是列表类型的父类型,或者是列表的超类型。