簡體   English   中英

java通用可比成語

[英]java generic comparable idiom

我遇到了泛型類的以下定義:

public class binarysearchnode<T extends Comparable<T>> implements Comparable<binarysearchnode<T>>{
.............
}

請幫助解釋為什么類在實現類似的接口時將自己指定為Type參數以進行比較? 它與以下內容有何不同:

public class binarysearchnode<T extends Comparable<T>> implements Comparable<? super (or extends)T>{
.............
}

這使得可以將binarysearchnode彼此進行比較。 如果它實現了Comparable<T> ,那么這意味着可以將節點與節點的進行比較,這將是奇數。

在課堂上你可能會發現這樣的事情:

T value;

public int compareTo(binarysearchnode<T> other) {
   return value.compareTo(other.value);
}

為了能夠像這樣實現compareTo() ,值類( T )需要與其類的其他對象相當 - 因此<T extends Comparable<T>>的聲明在類定義中<T extends Comparable<T>>

這是因為班級作者想要的是能夠寫:

b1.compareTo(b2)

其中b1b2binarysearchnode實例。 開發人員還T添加約束,以便T擴展Comparable<T> 可能是因為binarysearchnode搜索binarysearchnodeComparablebinarysearchnode可以依賴於T實例本身就是Comparable

更一般地說,雖然C1類可以實現Comparable<C2> ,但最終這樣做沒有任何意義:這並不意味着C2的實例可以與C1的實例相比。 並且由於類型擦除,這將是不可能的,例如,為類C1 同時實現Comparable<C1>Comparable<C2>

另外,如果binarysearchnode<T>直接實現Comparable<T> ,那么至少會有兩個問題:

  • 你將無法將一個binarysearchnode<T>與另一個進行比較;
  • 給定一個binarysearchnote<T>實例b和一個T實例t ,你可以寫b.compareTo(t)而不是t.compareTo(b) (因為T沒有,也不能,實現Comparable<binarysearchnode<T>> ),這打破了Comparable合同。

假設你有一個超類A和一個子類B 想象一下,超類實現了Comparable<A> ,然后B也將通過繼承實現Comparable<A>

您的binarysearchnode類聲明為:

public class binarysearchnode<T extends Comparable<T>>

將無法將B作為T的類型參數( B未實現Comparable<B> )但是當定義為:

public class binarysearchnode<T extends Comparable<? super T>>

它可以將B作為T的類型參數,因為B實現了Comparable<A> ,它實現了Comparable<? super T> Comparable<? super T>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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