[英]How return a generic array of <T extends Comparable<? super T>> in Java?
[英]Explanation of generic <T extends Comparable<? super T>> in collection.sort/ comparable code?
我一直使用類似的界面通過collection.sort為我的班級提供自然順序。
基本上如果我有一個人類,我會得到它來實現Comparable接口,並將提供compareTo的實現。 但是在javadocs中Collections.sort的定義中,我看到了這個簽名
public static <T extends Comparable<? super T>> void sort(List<T> list)
我根本不理解這個泛型定義? 不應該只是說
<T implements Comparable<T>>
有人可以幫我弄這個嗎?
實際上,這意味着T 可以實現Comparable<? super 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) {
// ...
}
}
在這種情況下,List可以按Collections.sort()
排序,但僅基於Person
的屬性,因為您將Student
實例作為Person
傳遞給compareTo()
(當然,除非你將它轉發)。
但實際上,您永遠不會看到Student
類實現Comparable<Person>
。 那是因為Person
可能已經實現了Comparable<Person>
,而Student
繼承了它的實現。 最終結果是相同的:您可以將List<Student>
傳遞給Collections.sort()
並將其排序在Person
的屬性上。
Comparable<T>
和Comparable<? super T>
之間的區別Comparable<? super T>
Comparable<? super T>
在Collections.sort()的重載版本中更明顯,它帶有一個Comparator<? super T>
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());
即使type參數實現了接口,也始終使用帶有泛型通配符的extends 。
如果你看一個實現Comparable的類,你會發現它實際上(應該)實現了Comparable<T>
,其中T是類本身。
如果考慮傳遞給Comparable接口的類型參數以及它在compareTo()方法中的使用方式,這是有意義的。
正如PM 77-1雄辯地指出的那樣, super關鍵字允許類,T或其父類之一實現Comparable 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.