2016-06-26 88 views
0

在處理與泛型聲明時遇到的聲明< ? 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.

所以我的問題是,當我們不能改變的事情與此,那有什麼用?只是從該集合中獲取元素,如果它是子類型的?

+0

您是否嘗試搜索?這一定是以前被問過的。 – Henry

+0

是的,我做了。但沒有問題涵蓋了我所問的問題,我知道這個通配符的用法,但是我的問題是爲什麼當我們不能添加/更改現有集合時使用它。 – hellrocker

+0

我沒有得到任何編譯錯誤 –

回答

0

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

+0

我不認爲添加這樣的作品。你不能添加這個集合的數組或數組。從技術上講,通過聲明您正在使集合不可變。我是否正確@ marko-topolnik –

+0

我唯一能清楚看到的是從集合類中使用Sort方法。 集合實現靜態類。排序是其中的一種語法:public static > void sort(List list)。如果我們不實現Comparable,那麼我們不能在這裏使用SORT。 –

2

So my question is when we can't modify the thing with this , then what is the use ? Just to get the elements from that collection if it is a subtype ?

是的,這是正確的。只是爲了從中獲取元素。

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

如果Java沒有通配符,那麼您的表達能力就會受到很大的限制。例如,通用addAll方法將只接受完全相同組件類型的集合。

相關問題