我一直使用类似的接口通过 collection.sort 为我的类提供自然排序。
基本上,如果我有一个 person 类,我将让它实现 Comparable 接口并提供compareTo 的实现。但是在 javadocs 中 Collections.sort 的定义中,我看到了这个签名
public static <T extends Comparable<? super T>> void sort(List<T> list)
我根本不明白这个泛型定义?难道不应该只是说
<T implements Comparable<T>>
有人可以帮我弄这个吗?
实际上,这意味着Tcan实施Comparable<? super T>
, 不只是Comparable<T>
.
例如,这意味着一个Student
类可以实现Comparable<Person>
, where Student
是一个子类Person
:
public class Person {}
public class Student extends Person implements Comparable<Person> {
@Override public int compareTo(Person that) {
// ...
}
}
在这种情况下,列表可以按以下方式排序Collections.sort()
但仅基于Person
的属性,因为你通过了Student
实例化为compareTo()
as a Person
(当然,除非你对此感到沮丧)。
然而在实践中,你永远不会看到Student
类工具Comparable<Person>
。那是因为Person
可能会实施Comparable<Person>
, and Student
继承它的实现。然而,最终结果是相同的:您可以传递List<Student>
to Collections.sort()
并对其进行排序Person
的属性。
和...之间的不同Comparable<T>
and 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());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)