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