2013-10-16 48 views
5

所以我們可以說我們有一個Java應用程序,抽象類名爲SomeAbstractClass,並且至少有10個這個超類的子類。什麼是集合<?擴展SomeAbstractClass>而不是集合<SomeAbstractClass>

什麼用的方式Collection<? extends SomeAbstractClass>使用泛型這個抽象超類,而不是僅僅使用Collection<SomeAbstractClass>

的也許我錯過了仿製藥裏面的東西很基本的東西。

+0

閱讀此。正是你想知道的.http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html –

+0

「術語列表比List <?extends Number>更具限制性,因爲前者匹配列表只有Number類型,而後者匹配Number或其任何子類的列表。「從上面的資源,SURESH鏈接。 – Fildor

+0

你可以看看這個。 http://www.thejavageek.com/2013/08/28/generics-the-wildcard-operator/ –

回答

4

這兩個聲明之間的區別:

Collection<? extends A> c1; 
Collection<A> c2; 

那是C2可以容納一個或子類的實例,但C1可以容納一些未知的,但具體的子類的實例(或A)或任何未知類的子類。

你不能將項目添加到C2,因爲編譯器不知道它是什麼類型,只是如果你得到一個出來就可以轉換爲A.

此外,您不能分配(即強制轉換)c1到c2 - c1不是c2類型的子類。下面

-2

你的情況,這都沒有區別,因爲類型是抽象的,但一般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)"

+2

-1完全不正確。通用綁定'?擴展X'包含'X' - 它也可以包含'X'的實例。並且在「其」中沒有撇號...所以有 – Bohemian

+0

「術語列表比List <?extends Number>更具限制性,因爲前者僅匹配類型Number的列表,而後者匹配Number或List類型的列表或它的任何子類「。從http://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html講述了一個不同的故事... – Fildor

+0

@Fildor對我來說聽起來有點奇怪,因爲它絕對不符合實際行爲。看我編輯的例子。 –

0

not true in generics

Collection<? extends SomeAbstractClass> 
      ^
       | 
       | 
Collection<SomeAbstractClass> 

Collection<? extends SomeAbstractClass>Collection<SomeAbstractClass>是完全不同的類型和不相關。

注意,

給定兩個具體類型A和B(例如,數量和整數), MyClass的具有MyClass的沒有關係,不管是否 不甲乙是相關的。

例如,即使Integer是Number的子類型,List<Integer>也不是List<Number>的子類型。

1

泛型中的通配符用於集合類型,通常不用於存儲元素。

例如,設想一個採用參數List<Number>的方法。現在

public void calculateSum(List<Number> numbers) { 
    for (Number n: numbers) { 
     // calculate Sum 
    } 
} 

,如果我們想通過傳遞List<Integer>如下計算整數的總和。(注意:IntegerNumber一個子類)

List<Integer> integers= new ArrayList<Integer>(); 
//Populate collection 
calculateSum(integers); //Error 

這將無法正常工作,即使IntegersNumberList<Integers>亞型是List<Number>不是一個亞型。需要注意的是List<Number>還可以存儲IntegerFloatDouble

所以,有一個通用的方法來計算任何類型的Number我們使用通配符如下

public void calculateSum(List<? extends Number> numbers) { 
    for (Number n: numbers) { 
     // calculate Sum 
    } 
} 

這將計算總和的總和任何類型的數字提供的類型延伸Number

相關問題