簡體   English   中英

<的用途是什么? 擴展E>

[英]What is the Use of < ? extends E >

在使用泛型時,我遇到了聲明< ? extends E> < ? extends E> 如果我以集合接口的addAll方法為例。

它的聲明就像:

   interface Collection<E> {
      public boolean addAll(Collection<? extends E> c);
  }

因此,根據以上對addAll的聲明,我所了解的(從不同來源中讀取)

  • ? extends E ? extends E意味着還可以將集合的所有成員與E的子類型的任何類型的元素相加

讓我們來看這個例子:

List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(2);

List<? extends Number> nums = ints; // now this line works
/*
 *without using ? syntax above line did not use to compile earlier 
 */
List<Double> doubleList = new ArrayList<Double>();
doubleList.add(1.0);
nums.addall(doubleList); // compile time error 

錯誤:

未為類型List <capture#1-of?確定方法addall(List <Double>)。 擴展Number>

我還讀過O'Reilly的“ Java泛型和集合”

通常,結構是否包含類型為?的元素? 擴展E,我們可以將元素從結構中移出,但是我們不能將元素放入結構中。

所以我的問題是,當我們不能用它來修改東西時,那有什么用? 只是為了從該集合中獲取元素(如果它是子類型)?

所以我的問題是,當我們不能用它來修改東西時,有什么用? 只是從該集合中獲取元素(如果它是子類型)?

對,那是正確的。 只是為了從中獲取元素。

請記住Collection<? extends Number> Collection<? extends Number>變量的類型,而不是集合本身的類型。 通配符語法的含義更類似於特定集合必須匹配的模式,而不是“對象X的類型為T”的類型。

如果Java沒有通配符,那么您將無法表達。 例如,通用addAll方法將只接受完全相同的組件類型的集合。

這意味着addAll方法允許擴展E類的任何對象集合。 例如,如果G擴展了E,則可以向此集合添加G的數組。

暫無
暫無

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

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