[英]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)
其中b1
和b2
是binarysearchnode
實例。 開發人員還向T
添加約束,以便T
擴展Comparable<T>
。 可能是因為binarysearchnode
搜索binarysearchnode
的Comparable
的binarysearchnode
可以依賴於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.