[英]What is difference between <? extends Object> and <E extends Object>?
<? extends Object>
什么區別<? extends Object>
<? extends Object>
和<E extends Object>
? 應該何時使用另一個?
以下是我立即想到的一些差異:
類型參數邊界可以指定多個邊界 - T extends A & B
,但是使用通配符不能指定多個邊界 - ? extends A & B
? extends A & B
無效。
你可以使用通配符下限 - ? super A
? super A
有效,但不是類型參數 - T super A
無效。
創建泛型類型時,不能使用通配符邊界。 您必須使用類型參數邊界。
在方法內部,如果要在傳遞的參數的類型參數之間建立某種關系,則必須使用類型參數邊界。 例如,您希望傳遞兩個具有相同類型參數的參數化類型。 你不能用通配符邊界做到這一點。 所以下面的方法聲明將采用兩個相同類型參數的列表,即擴展Number
。
public <T extends Number> void merge(List<T> list1, List<T> list2) { }
最后,我將從Effective Java中添加一些要點- 第28項:使用有界通配符來增加API靈活性 :
為獲得最大的靈活性,請在表示生產者或使用者的輸入參數上使用通配符類型 如果輸入參數既是生產者又是消費者,那么通配符類型對您沒有好處:您需要一個精確的類型匹配,這是您在沒有任何通配符的情況下獲得的。
不要將通配符類型用作返回類型。 它不會為您的用戶提供額外的靈活性,而是迫使他們在客戶端代碼中使用通配符類型。 正確使用的通配符類型對於類的用戶幾乎是不可見的。 它們使方法接受它們應該接受的參數並拒絕它們應該拒絕的參數。 如果類的用戶必須考慮通配符類型,那么類的API可能有問題。
參考文獻:
<? extends Object>
<? extends Object>
是一個有界通配符 (一個未知的擴展Object
,而<E extends Object>
是有界的( E
需要一個擴展Object
的參數化類型)。
綁定通配符與參數化上限的最微妙差異:
創建通用類型類時不能使用有界通配符,只允許使用類型化參數。
有界通配符不能在Collection
中使用,它需要在Collection
中添加項目,因為它是未知類型,並且集合不知道它接收的是什么類型,因此它不是類型安全的。
有界通配符不能限制為多個泛型類型(邊界)。
我希望這有幫助。
如果您稍后需要參考該類型,請使用E
用?
如果您再也不必參考該類型。
在通用代碼中,稱為通配符的問號(?)表示未知類型。 通配符可用於各種情況:作為參數,字段或局部變量的類型; 有時作為返回類型(雖然更好的編程實踐更具體)。 通配符從不用作泛型方法調用,泛型類實例創建或超類型的類型參數。 有關詳細信息,請檢查此
<E>
聲明一個類型參數。
您只能在創建泛型類型或方法時使用它。
<? ...>
<? ...>
是類型參數的通配符值 。
您只能在創建封閉的泛型類型時使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.