[英]Understanding Java Generics <T extends Class> and <? extends Class>
[英]The syntax <T extends Class<T>> in Java
關於以下內容我有幾點想法:
public interface MaxStack<T extends Comparable <T>>
1 - 為什么實現MaxStack
的類應該像這樣編寫:
public class MaxStackclass<T extends Comparable <T>> implements MaxStack<T>
而不是public class MaxStackclass<T extends Comparable <T>> implements MaxStack<T extends Comparable <T>>
?
2-為什么這個類的私有變量,當我使用泛型時,應該只用<T>
編寫而不用<T extnds Comparable<T>>
? 例如, private List<T> stack= new ArrayList<T>();
3 - <T extends Comparable<T>>
和<T extends Comparable>
之間有什么區別 - 如果我需要比較我班級中的bewteen元素,兩者都可以,不是嗎?
編輯:我認為3的問題是,它可能允許插入以第二種方式定義的列表,以便具有不同的元素,這些元素都可以從可比較的方面擴展,然后當我想比較它們時,它將是不可能的,因為我們無法將String與Integer進行比較,所以都從Comparable擴展。
在聲明中, maxStackclass<T extends Comparable <T>>
你已經在T
上表達了界限。 所以你不需要它了。
原因與上述相同。 無需再次在同一類型參數上指定邊界。
<T extends Comparable<T>>
表示T
必須實現可比較兩個T
實例的Comparable
接口。 雖然<T extends Comparable>
意味着T
實現了Comparable
,因此它可以比較兩個Object
。 前者更具體。
如果我需要比較班上的各種元素,兩者都可以,不是嗎?
嗯,從技術上講,你可以使用兩者來達到相同的效果。 但是對於聲明<T extends Comparable>
,它將涉及不必要的強制轉換,你可以避免使用類型safe <T extends Comparable<T>>
1)類有一個帶有bound的類型參數T
( extends Comparable <T>
),這個參數傳遞給接口(這里需要相同的綁定)。 傳遞類型參數時,您不能重復它的約束 - 為什么要這樣做?
2)如1),類型參數聲明其綁定,不重復必要。
澄清:
第一個類型參數出現(在接口或類名后面)是它的聲明。 任何以下出現都是一種用法。 你每次使用它時都不會寫一個變量類型聲明,對吧?
“3 - <T extends Comparable<T>>
和<T extends Comparable>
之間的區別是什么? - 如果我需要比較我班級中的bewteen元素,兩者都可以,不是嗎?”
不,兩者都不會好的。 假設我有一類Foo
其implements Comparable<Bar>
但類Foo和酒吧有沒有關系的對方。 然后Foo
無法與Foo
類型的其他對象進行比較。 <T extends Comparable<T>>
會將此作為一個問題。 <T extends Comparable>
不會。
<T extends Comparable<? super T>>
這里有更多細節
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.