2016-04-25 56 views
3

我有一個類B它擴展了A存儲AItem商店BItem泛型向數組中添加子類

在列表的列表 'A' 我有一個ArrayList的其使用[?擴展了AItem]。

我認爲這意味着我可以使用此ArrayList的任何類型的擴展AItem的對象。

所以在我的B類中,我有一個方法add(..),它將BItem添加到項目中。

我認爲這將工作,因爲項目arrayList可以容納從AItem延伸的任何對象的列表。

import java.util.ArrayList; 

class A { 
    public ArrayList<? extends AItem> items; 
} 

public class B extends A{ 

    public void add(BItem i) { 

     this.items.add(i); //compile error here 
    } 
} 

//items : 
class AItem {} 
class BItem extends AItem{} 

我該如何得到這個工作?

我的編譯錯誤是這樣的:

Add方法(捕獲#2的擴展AItem?)在類型 ArrayList中是不適用的 參數(BItem)

+0

無法項目添加到[我如何添加 – Ian2thedv

+1

未知類型可能重複的名單到列表<?擴展數字>數據結構?](http://stackoverflow.com/questions/2776975/how-can-i-add-to-list-extends-number-data-structures) – Ian2thedv

+0

非常好的問題。我保持尋找答案,但我認爲你需要用一些類來初始化arrayList。 – jabujavi

回答

6

你可能不需要在這裏使用泛型。具有AAItem類型的列表應該罰款(我也將宣佈它List代替ArrayList類型的最佳實踐):

class A { 
    public List<AItem> items; 
} 

class B extends A { 

    public void add(BItem i) { 

     this.items.add(i); 
    } 
} 

? extends AItem的問題是,編譯器不能保證實際類型的元素是AItemBItem。它可能是另一個子類CItem,在這種情況下類型安全性被破壞。

另外的方法來設計類層次結構與仿製藥,在其中設置的類型參數在父類中,並將其設置在擴展類B適當的子類(BItem):

class A<T extends AItem> { 
    public ArrayList<T> items; 
} 

class B extends A<BItem>{ 

    public void add(BItem i) { 

     this.items.add(i); 
    } 
} 
+0

我不認爲我可以簡化,就像你的第一個答案。讓我回到你身邊.. –

2

嘗試用super

import java.util.ArrayList; 

class A { 
    public ArrayList<? super AItem> items; 
} 

public class B extends A{ 

    public void add(BItem i) { 

     this.items.add(i); //compile error here 
    } 
} 

//items : 
class AItem {} 
class BItem extends AItem{} 

更換extends您可能會發現有關原因的更多細節behin d這種行爲,here

1

可以使用

public ArrayList<? super AItem> items; 

,你可以添加到列表現在

,但你不能做

public class B extends A{ 
..... 

    public BItem getOne(int idx) { 
    return this.items.get(idx); 

    } 
} 

JVM不會知道列表中的實際內容。

可以泛型化A類

class A<T> { 
    public ArrayList<T> items; 
} 

然後定義B級爲

public class B extends A<BItem>{ 

    public void add(BItem i) { 

     this.items.add(i); 
    } 
}