2012-05-11 48 views
1

可能重複:
Is List<Dog> a subclass of List<Animal>? Why aren't Java's generics implicitly polymorphic?鑄基類列表以子類List

我有類延伸動物和具有的列表的列表以下類型。

ArrayList<Animals> animal = new ArrayList<Animals>(); 

現在我有另一個類,小狗,它擴展了狗。

而且有List<Puppy> puppy = new ArrayList<Puppy>();

現在我想演員名單animalpuppy。是否可以直接做?

我可以這樣做,如下所示。

for (Animals ani: animal){ 
    puppy.add((Puppy) ani) 
} 

但我想要一個直接的鑄造解決方案。可能嗎?

+0

定義 「直接鑄造解決方案」? –

+1

如果你有一個實際上是狗的動物列表,並且你想要處理狗而不是動物,那麼爲什麼你的列表是一個動物列表? –

+0

繼Vakimshaar的評論之後,如果你的代碼需要很多這樣的危險轉換(可能會導致異常),那麼你應該重新考慮你的代碼。例如。不要像這樣添加小狗,請調用Animal類中的方法,將它們添加到適當的列表中...爲每個子類重寫該方法 –

回答

13

沒有,除非你確定你的第一個列表它不會直接合作爲:

List<? extends Animals> animal; 

,那麼你將能夠做到:

List<Puppy> puppy = new ArrayList<Puppy>(); 
animal = puppy; 
0

首先你要確定你的基類列表as ...

public ArrayList<? super Animal> ani; 

然後將您的基類列表放在擴展類中作爲...

ArrayList<? extends Animal> puppy= new ArrayList<Puppy>(); 
puppy= (ArrayList<? extends Animal>)ani; 
List<Puppy> castPuppy = (List<Puppy>)puppy;//here we case the base class list in to derived class list. 

注:它可能通過檢查異常

+2

如果「ani」實際上不包含Puppy對象,則此方法非常危險。編譯器不會抱怨,但puppy變量實際上會包含對Animal對象的引用。任何嘗試將它們用作「小狗」都會導致異常。換句話說,'castPuppy.get(0)instanceof Puppy'將是錯誤的!而且,'Puppy p = castPuppy.get(0)'會拋出一個運行異常! – gMale