所以我們可以說我們有一個Java應用程序,抽象類名爲SomeAbstractClass
,並且至少有10個這個超類的子類。什麼是集合<?擴展SomeAbstractClass>而不是集合<SomeAbstractClass>
什麼用的方式Collection<? extends SomeAbstractClass>
使用泛型這個抽象超類,而不是僅僅使用Collection<SomeAbstractClass>
的也許我錯過了仿製藥裏面的東西很基本的東西。
所以我們可以說我們有一個Java應用程序,抽象類名爲SomeAbstractClass
,並且至少有10個這個超類的子類。什麼是集合<?擴展SomeAbstractClass>而不是集合<SomeAbstractClass>
什麼用的方式Collection<? extends SomeAbstractClass>
使用泛型這個抽象超類,而不是僅僅使用Collection<SomeAbstractClass>
的也許我錯過了仿製藥裏面的東西很基本的東西。
這兩個聲明之間的區別:
Collection<? extends A> c1;
Collection<A> c2;
那是C2可以容納一個或子類的實例,但C1可以容納一些未知的,但具體的子類的實例(或A)或任何未知類的子類。
你不能將項目添加到C2,因爲編譯器不知道它是什麼類型,只是如果你得到一個出來就可以轉換爲A.
此外,您不能分配(即強制轉換)c1到c2 - c1不是c2類型的子類。下面
你的情況,這都沒有區別,因爲類型是抽象的,但一般Collection<SomeClass>
可以包含SomeClass
和所有它的子類,而Collection<? extends SomeClass>
不能包含SomeClass
,但只有它的子類。
你可以自己試試。
List<Number> foo = new ArrayList<>();
foo.add(Integer.valueOf(0));
作品而
List<? extends Number> foo = new ArrayList<>();
foo.add(Integer.valueOf(0));
沒有。它顯示了錯誤"The method add(capture#1-of ? extends Number) in the type List<capture#1-of ? extends Number> is not applicable for the arguments (Integer)"
Collection<? extends SomeAbstractClass>
^
|
|
Collection<SomeAbstractClass>
Collection<? extends SomeAbstractClass>
和Collection<SomeAbstractClass>
是完全不同的類型和不相關。
注意,
給定兩個具體類型A和B(例如,數量和整數), MyClass的具有MyClass的沒有關係,不管是否 不甲乙是相關的。
例如,即使Integer是Number的子類型,List<Integer>
也不是List<Number>
的子類型。
泛型中的通配符用於集合類型,通常不用於存儲元素。
例如,設想一個採用參數List<Number>
的方法。現在
public void calculateSum(List<Number> numbers) {
for (Number n: numbers) {
// calculate Sum
}
}
,如果我們想通過傳遞List<Integer>
如下計算整數的總和。(注意:Integer
是Number
一個子類)
List<Integer> integers= new ArrayList<Integer>();
//Populate collection
calculateSum(integers); //Error
這將無法正常工作,即使Integers
是Number
List<Integers>
亞型是的List<Number>
不是一個亞型。需要注意的是List<Number>
還可以存儲Integer
,Float
,Double
等
所以,有一個通用的方法來計算任何類型的Number
我們使用通配符如下
public void calculateSum(List<? extends Number> numbers) {
for (Number n: numbers) {
// calculate Sum
}
}
這將計算總和的總和任何類型的數字提供的類型延伸Number
閱讀此。正是你想知道的.http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html –
「術語列表比List <?extends Number>更具限制性,因爲前者匹配列表只有Number類型,而後者匹配Number或其任何子類的列表。「從上面的資源,SURESH鏈接。 –
Fildor
你可以看看這個。 http://www.thejavageek.com/2013/08/28/generics-the-wildcard-operator/ –