2016-03-03 41 views
-2

當使用Collections.sort(List<T> list)時,與List<Employee>,其中Employee是一個不擴展的類Comparable接口。仿製藥 - 收集分類方法

直到看見以下編譯錯誤

在類型Collections方法sort(List<T>)不適用的參數(List<Employee>)。

我不明白爲什麼T應該實現Comparable,它沒有任何地方sort方法的方法參數指定。

更新:請停止downvoting。我一直認爲只有方法參數決定了作爲參數傳遞的內容,但我在方法簽名中看到了<T extends Comparable<? super T>>,但在方法簽名中看不到它。訪問修飾符,靜態或不是,返回類型,方法的名稱是我知道的,但多餘的是什麼?

更新:我沒有意識到這一點:「所有的泛型方法聲明具有(<和>)由尖括號分隔的類型參數部分先於方法的返回類型」

+7

是的,它是:['public static > void sort(List list)'](https://docs.oracle。com/javase/7/docs/api/java/util/Collections.html#sort%28java.util.List%29) – resueman

+1

作爲一般規則,如果您無法手動執行某些操作(即使緩慢:)),那麼計算機也是如此。所以記住這一點:如果我給了你一個FooBars的列表,並且沒有關於FooBar的信息,並要求你對它們進行排序 - 你會怎麼做?這兩個答案是爲了讓FooBar能夠告訴你如何對自己進行排序(即它是Comparable)還是讓你告訴我如何比較它們(即傳入比較器)。 – yshavit

+0

我只是不明白'>'是在方法簽名中。它不是訪問修飾符,返回類型,方法名稱,那麼它是什麼呢? – user2296988

回答

5

這裏的完整簽名:

public static <T extends Comparable<? super T>> void sort(List<T> list) 

,你可以看到T必須實現Comparable否則怎麼會sort()知道如何排序的List<T>

+0

什麼是<方法簽名中的>?它是用於聲明泛型類型的特殊功能嗎? – user2296988

+0

'>'意味着'T'類型實現了'Comparable'接口中聲明的所有方法。 「Comparable」本身就是一個通用接口,它要求它操作的類型必須是「T」類型或「T」的超類。 – callyalater

4
public static <T extends Comparable<? super T>> void sort(List<T> list) 

如果你不知道哪個員工比另一個員工大,你不能排序。只需添加一個自定義的比較器。

0

對於諸如int,long,float等原始數據類型,比較是預定義的。 然後排序接受預定義的比較度量並對變量進行排序。

但是,當您創建一個類時,一個類可以由許多不同的基元類型和其他對象組成。 Java不能自動知道如何比較,所以它需要擴展可比的接口並定義指定如何排序的函數。對於例如

Class car { 
int id; 
String name; 
String company; 
} 

實施可比較後,您可以定義如果你的排序取決於車的名稱,它的名稱或公司名稱。 希望這個清除需要一點。

0

對於泛型,有兩種方法:1.通配符和2.有界類型參數。

實施例與通配符: public void sort(List<? extends T> list)

實施例具有有界類型: public static <T extends Comparable<? super T>> void sort(List<T> list)

有界類型是優選的時`T需要被使用一次以上,例如在上面的例子。