Collections.sort通用方法签名

时间:2018-08-04 04:27:14

标签: java generics bounded-wildcard

在java.util.Collections内部,我们具有以下方法签名

public static <T> void sort(List<T> list, Comparator<? super T> c) 

我不明白为什么要指定

Comparator<? super T>

代替

Comparator<T>

它涵盖哪些用例?

2 个答案:

答案 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既可以与其自身进行比较,又不是列表类型的父类型,或者是列表的超类型。