簡體   English   中英

<?有什么區別? extends Object>和<E extends Object>?

[英]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.

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