Ответ 1
Собственно, это означает, что T может реализовать Comparable<? super T>
, а не только Comparable<T>
.
Например, это означает, что класс Student
может реализовать Comparable<Person>
, где Student
является подклассом Person
:
public class Person {}
public class Student extends Person implements Comparable<Person> {
@Override public int compareTo(Person that) {
// ...
}
}
В этом случае список можно сортировать по Collections.sort()
, но только на основе свойств Person
, потому что вы передаете экземпляр Student
в compareTo()
как Person
(если вы его не убьете, конечно).
Однако на практике вы никогда не увидите реализацию класса Student
Comparable<Person>
. Это потому, что Person
, вероятно, реализовал Comparable<Person>
, а Student
наследует его реализацию. Конечный результат один и тот же: вы можете передать List<Student>
в Collections.sort()
и отсортировать его по свойствам Person
.
Разница между Comparable<T>
и Comparable<? super T>
более очевидна в перегруженной версии Collections.sort(), которая принимает Comparator<? super T>
:
class ByAgeAscending implements Comparator<Person> {
@Override public int compare(Person a, Person b) {
return a.getAge() < b.getAge();
}
}
List<Student> students = getSomeStudents();
Collections.sort(students, new ByAgeAscending());