2010-07-27 15 views
2

在Java中,我將如何使用泛型創建一個max函數,該函數需要兩個相同類型的Comparable對象並返回較大的對象?使用泛型創建最大函數返回較大的一個

我嘗試:

public static <T extends Comparable> T max(T obj1, T obj2) 
{ 
    return (((obj1).compareTo(obj2) >= 0) ? obj1 : obj2); 
} 

(。如果它們均等於它返回OBJ1)

該方法基於代碼我發現在http://www.informit.com/articles/article.aspx?p=170176&seqNum=3

然而,當我編譯我得到這樣的警告(與-Xlint編譯:未選中): 警告:未經檢查]作爲原料類型的成員未經檢查調用的compareTo(T)java.lang.Comparable的

回答

11

發生這種情況是因爲您使用原始類型Comparable,並且編譯器無法確定您正在比較的內容,因爲compareTo使用Comparable的類型參數。您需要參數化可比還有:

public static <T extends Comparable<? super T>> T max(T obj1, T obj2) 

您需要使用? super T因爲你可能有延伸的B類,它實現Comparable<B> A類,但一個沒有實現Comparable<A>。因此,您可以傳遞最多兩個A對象,而B匹配? super A,因此即使對於A對象,也可以調用B中定義的compareTo方法。如果你想使用<T extends Comparable<T>>並試圖通過兩個A對象編譯會抱怨說,他們沒有實現Comparable<A>,即使它們繼承B.

+0

類似於'Collections.max()'。 – 2010-07-27 20:52:31

+0

非常感謝。 – ladaghini 2010-07-27 23:32:33

+0

@MarkPeters:你能解釋Collections.max()函數的泛型部分嗎?它太混亂了。或者請提供相關鏈接。 – IfOnly 2017-05-04 15:40:34

0

public static <T extends Comparable<T>>一個compareTo方法將移除警告。

+1

這不是一個很好的API選擇,儘管它不必要的限制。 – 2010-07-27 20:53:33