2012-02-01 69 views
1

我有一些排序方法,爲了工作,他們需要接受定義了compareTo的對象。Java:我完全不明白這個泛型定義

以下的一般定義的一部分:

private static <SomeType extends Comparable<? super SomeType>> 
    void doSomeSort(SomeType[] a, int left, int right){ 

似乎這樣的伎倆。

我的問題是,我真的不明白什麼
<SomeType extends Comparable<? super SomeType>>

實際上定義。
這意味着你可以代表一個類型,它是一個接口,它擴展了它本身實例化的Comparable ...
我沒有得到。

你能幫忙澄清這個定義嗎?

+0

http://stackoverflow.com/questions/8422078/class-definition-class-name/8422157可能出現重複。 – Tudor 2012-02-01 18:27:51

回答

1

最終,你真正需要知道的是,它意味着:

SomeType x = ...; 
SomeType y = ...; 
int comparison = x.compareTo(y); 

將編譯。

更確切地說,它意味着SomeType實現Comparable<T>針對某些類型的T這是在SomeType繼承層次......您無需指定T是什麼,但其結果是,上面的代碼工作:)

+0

但定義說'擴展Comparable'.Not'SomeType實現Comparable' – Cratylus 2012-02-01 18:31:30

+0

@ user384706:通用約束不使用'implements',就這樣。哎呀,'SomeType' *可能是一個界面。 – 2012-02-01 18:33:30

1

它轉換爲:

  • 類型SomeType必須擴展或實現Comparable
  • Comparable本身,在這種情況下,需要一些類型作爲參數,我們稱之爲T
  • 類型T必須是SomeType或超類SomeType

適合此模式的經典類型是Integer,因爲它實現了Comparable<Integer>

1
<SomeType extends Comparable<? super SomeType>> 

可比較始終是特殊的模板類型。 因此Comparable<String>是可以與String比較的東西,Comparable<BigInteger>是可以與BigInteger比較的東西,依此類推。

這裏預計的是SomeType,它源於Comparable<T>。這意味着SomeType與其他實例相當。最瑣碎的事情是

<SomeType extends Comparable<SomeType>> 

應該清楚,直到現在。 現在添加的所有內容都是一個簡單的super關鍵字。 這意味着,SomeType需要與類型爲SomeType的任何東西或衍生層次結構中的任何其他東西相媲美。 這基本上有一個好處:您可以稍後從SomeType派生自己的/附加類型,並且此方法仍然向下兼容! 太棒了,呃?

例如:

class SomeTypeSuper { ... } 
class SomeType extends SomeTypeSuper { ... }  

// Now, in your code both is valid: 
// Asuming the method `yourMethod` expects a `<SomeType extends Comparable<? super SomeType>>` as parameter. 

yourMethod(new SomeTypeSuper()); // This wouldn't be valid if we had used Comparable<SomeType> 
yourMethod(new SomeType()); 
+0

'? super SomeType'在繼承層次結構中接受任何類*上面的* SuperType,而不是*下面*。 – 2012-02-01 18:30:13

+0

@JBNizet是的,對!顯然是筆的一部分:/。我編輯它。 – poitroae 2012-02-01 18:38:09

3

這意味着:

SOMETYPE是延伸Comparable<SomeType>Comparable<Any type that is a superclass or super interface of SomeType>一個類。

? super SomeType的原因是,排序程序能夠如果SOMETYPE是能夠將其自身比較其他SOMETYPE實例進行排序SOMETYPE實例的數組。如果SomeType擴展了SomeSuperType,並且任何SomeSuperType實例都能夠將其自身與其他SomeSuperType實例進行比較,那麼排序將比較它們而不會出現問題。

0

Float是Number的子類。我們可以這樣聲明:

class Float extends Number implements Comparable<Float> 

但是事實上,我們的Float類比這個更廣泛。 Float類知道如何用自己整數,大數,雙打,等等等等,其實,我們的浮動類就知道如何自己比較比較*任何(數字

class Float extends Number implements Comparable<Number> 
class Integer extends Number implements Comparable<Number> 

事實上:任何數量級需要做到這一點,做到了真正的聲明薩雷

class Number implements Comparable<Number> 
class Integer extends Number 
class Float extends Number 

現在,進行比較的接口同此涼,如果沒有通配符,則浮點數和整數就無法相媲美。

但是既然是這樣,你可以ñ去:

Comparable<Number> array[] = new Comparable<Number>[10]; 
array[0] = Float.getValue(10);  
array[1] = Integer.getValue(11); 
sort(array, 0, 1);  

你不能這樣做,沒有>?超T>。

+0

你的答案似乎與這裏的概念非常接近,但有錯誤。即使你的示例代碼是錯誤的。你不能這樣做'可比較的 array [] = new ..'開頭。 – Cratylus 2012-02-05 20:00:58