簡體   English   中英

泛型的解釋<T extends Comparable <? superT >>在collection.sort /可比代碼?

[英]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> ,其中StudentPerson的子類:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM