2014-04-21 76 views
2

我有一個類,比如說 - Animal。還有一些繼承自它的類,比如說:BirdCat,Dog從超類對象列表中獲取子類

現在我創建一個Animal類型的數組列表,併爲其添加一些子類的實例。

private List<Animal> list = new ArrayList<Animal>(); 
list.add(new Bird()); 
list.add(new Bird()); 
list.add(new Cat()); 
list.add(new Dog()); 

然後,我通過這個列表循環,調用一些方法等

for(int i = 0; i < list.length; i++) 
{ 
    list.get(i).makeSound(); 
} 

精細。但是如果我想在Bird子類中添加一個方法,那麼將不會在Animal超類中實現?比方說,fly()方法,所以它看起來像這樣:

for(int i = 0; i < list.length; i++) 
{ 
    list.get(i).makeSound(); 
    if(list.get(i) instanceof Bird) 
    { 
     list.get(i).fly(); // error here 
    } 
} 

這是有道理的,但它拋出一個錯誤 - 無法找到象徵。在Animal類中實現該方法似乎解決了這個問題,但是當我必須這樣做幾次時,它會傷害我的眼睛。有沒有辦法解決這個問題?

+0

這是什麼 - 'ArrayList list = new List ;'?我只在這條線上計算兩個編譯時間錯誤... –

+0

是的,抱歉,編輯。 – khernik

回答

2

你需要轉換爲Bird

((Bird)list.get(i)).fly(); 
1

如果您已經確定,這是一個Bird,那麼你可以投你Animal作爲Bird,它允許你打電話fly()

if(list.get(i) instanceof Bird) 
{ 
    Bird bird = (Bird) list.get(i); 
    bird.fly(); 
} 
+1

大概最好提一下,兩次從列表中獲得'i'不是一個好主意。在任何情況下,OP都應該使用增強型for循環。 –

0

你要 '投射' 回到鳥的一個實例。

if(list.get(i) instanceof Bird) 
{ 
    Bird bird = ((Bird) list.get(i)); 
} 

我也會重寫你的循環是一個「每個」循環以及:

for(Animal animal : list) 
{ 
    animal.makeSound(); 
    if(animal instanceof Bird) 
    { 
     ((Bird) animal).fly(); 
    } 
} 
0

的動物引用數組,只有你自己知道什麼參考實際上指向,需要讓編譯器知道通過轉換...在編譯時編譯器會檢查動物。 class文件,看看是否有makeNoise metbod,如果有它不會拋出錯誤,在運行時它會跟隨動物引用和amd看它實際指向什麼,並調用該類makeNoise metbod,如你所說在你的動物課堂中沒有makeNoise方法,所以是的,鑄造是必要的。 ...

相關問題