Collections.sort универсальный метод подписи
Внутри java.util.Collections у нас есть подпись метода ниже
public static <T> void sort(List<T> list, Comparator<? super T> c)
Я не понимаю, почему можно было бы указать
Comparator<? super T>
вместо
Comparator<T>
Какие варианты использования он охватывает?
2 ответа
Вот пример:
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>
вышеуказанный код не будет компилироваться.
// 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)
Эти подписи отличаются, потому что они накладывают различные требования на отношения между типом T и аргументом типа Comparable в определении T.
Предположим, например, что у вас есть этот класс:
class A implements Comparable<Object> { ... }
Тогда, если у вас есть
List<A> list = ... ;
sortA(list); // works
sortB(list); // fails
Причина, по которой sortA не работает, заключается в том, что не существует типа T, который был бы сопоставим с самим собой, а также является или является супертипом типа списка.