在處理與泛型聲明時遇到的聲明< ? extends E>
。 如果我以集合接口的addAll方法爲例。什麼是<?擴展E>
它的聲明是這樣的:
interface Collection<E> {
public boolean addAll(Collection<? extends E> c);
}
從中的addAll上述聲明我所瞭解(從不同的來源讀取)
使
? extends E
意味着它也OK添加具有任何類型元素的所有成員都是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
錯誤:
The method addall(List< Double >) is undefined for the type List< capture#1-of ? extends Number >
我也看了在O'Reilly的 'Java泛型和集合'
In general, if a structure contains elements with a type of the form ? extends E, we can get elements out of the structure, but we cannot put elements into the structure.
所以我的問題是,當我們不能改變的事情與此,那有什麼用?只是從該集合中獲取元素,如果它是子類型的?
您是否嘗試搜索?這一定是以前被問過的。 – Henry
是的,我做了。但沒有問題涵蓋了我所問的問題,我知道這個通配符的用法,但是我的問題是爲什麼當我們不能添加/更改現有集合時使用它。 – hellrocker
我沒有得到任何編譯錯誤 –