2016-03-26 55 views
0

我可能只是在設計這個錯誤,但說我有4種不同類型的動物。我有一隻鳥,一匹馬,一隻老鼠和一條魚。我試圖把它們全部作爲動物的一個子類,但這是不好的設計或容易出錯,但有一些方法來自動物我希望它們都擁有,我希望它們都可以在幾乎相同的地方使用。是否有可能使ArrayList只接受實現特定接口的對象?

所以我讓動物成爲一個接口,現在我想讓它們有一個數組列表,但ArrayList不起作用,因爲Animal不是一個類。

任何人都可以幫助我,或者有更簡單/更簡單的設計方法嗎?

我animalHouse類

import java.util.ArrayList; 

public class AnimalHouse { 
private ArrayList<? extends Animal> animals; 


public AnimalHouse(Bird a, Bird b) 
{ 
animals = new ArrayList(); 
animals.add(a); 
animals.add(b); 
} 
} 

我的鳥類

public class Bird implements Animal { 

@Override 
public void run() { 
    System.out.println("run"); 

} 

@Override 
public void sit() { 
    System.out.println("sit"); 

} 

} 

和我的接口

public interface Animal { 
public void run(); 
public void sit(); 
} 
+4

一個接口類型的ArrayList是完全可能的。請顯示你的代碼。 –

+1

您可以創建列表,比如'List ',但是在檢索時,您需要將其轉換爲其子類,以便能夠調用子類的功能。 –

+1

您的陳述「ArrayList不起作用,因爲Animal不是類」是錯誤的。正如其他人所問,請發佈您的代碼並特別告訴我們問題是什麼(編譯器錯誤,異常等)以及它發生的位置(您發佈的代碼中的哪一行)。 –

回答

3

你可以這樣做:

ArrayList<Animal> l = new ArrayList<>(); 

請注意,Animal可以是一個類或接口。現在可以添加擴展類或實現接口的元素。

+1

它告訴我不能實例化類型ArrayList <?擴展動物> – quickdash

+0

您應該發佈引發異常和其堆棧跟蹤的程序的一部分。我們無法猜測您的代碼的具體情況......;) – schwobaseggl

+0

@quickdash我在答案中更具體地說明了如何正確使用該代碼段。 – schwobaseggl

-3

有這樣做的方法有兩種:

可以使用榜上無名「匿名」類型的任何與此接口的?運營商,像這樣:

ArrayList<? implements SomeInterface> // in your case 'implements Animal' 

否則,應用一些驗證到您的列表的內容管理,使用Java的instanceof運營商找到相關的基類或接口:

//adding an element 'newAnimal' to your ArrayList 'zoo' 
//check interface present 
if (newAnimal instanceof Animal) 
{ 
    //inclusion accepted 
    zoo.add(newAnimal); 
} 
else 
{ 
    //error message 
    System.out.print("Animal cannot be accepted!"); 
} 

希望這有助於!

+0

你能夠使用ArrayList <?實現SomeInterface>?當我嘗試,而不是擴展,我得到「令牌語法錯誤」實現「,預計」 – quickdash

+0

您可能不得不嘗試'擴展'而不是'實現',我相信'?'和'instanceof'運營商設置爲處理超類和接口@quickdash – marcuthh

相關問題