你的代碼對我來說絕對沒有意義。我想我明白你想要的是什麼。首先讓我們看看你的代碼。
你有一個Goose
類實現Animal
這是很好的。然後,你有一個叫班上link
列表:
public class Goose implements Animal{
List<Animal> link = new ArrayList<Animal>(); //remember().
...
您Goose
類的每個實例都會有動物名單。這看起來很奇怪。從這個問題來看,這聽起來像是你想要一個包含動物的列表,而不是每個Goose
中的列表。
然後你有兩個構造函數:
Goose(Duck d){
link.add(d);
}
Goose(Goose g){
link.add(g);
}
你需要無論是Duck
或Goose
爲您添加到新Goose
的內部列表輸入。每個新實例的含義都是從其列表中的Duck
或Goose
開始。看來你想讓你的構造函數成爲add
方法。
最後你有這些:
Goose g3 = new Goose(new Duck()); //You were missing() here also
Goose g2 = new Goose(g2); //Syntax error. Should probably be ".. new Goose(g3);"
我不完全知道爲什麼你有這些你Goose
類中,他們看起來像他們應該在別處聲明。因爲它現在每個Goose
包含另外兩隻鵝,分別叫做g3
和g2
,它們也沒什麼意義(除非它們被用作參考鵝的父母,但似乎並非如此)。
我想你想,你是如何實現它:您需要修改Goose
類,以便每隻鵝只有會員相關爲每隻鵝。它看起來是這樣的(假設動物接口聲明的eat()
法):
public class Goose implements Animal {
@Override
public void eat() {
// Om nom nom
}
}
然後,您可以移動link
,g2
和g3
到main
方法:
public static void main(String[] args) {
List<Animal> link = new ArrayList<Animal>();
Goose g2 = new Goose();
Goose g3 = new Goose();
link.add(g2);
link.add(g3);
..
這樣做,你只能使用main
方法中的link
列表。您還可以將其作爲包含main
的類的一個屬性以擴大範圍。如果你需要全球訪問,你可以創建一個包含它的類singleton(或者在某個地方使它成爲public static
,但我會推薦另一種方法)。
您還可以添加一個Duck
到列表中,如果Duck
類實現Animal
接口正確:
link.add(new Duck());
如果Animal
接口聲明瞭一個名爲公共方法eat
您可以通過列表現在循環,使所有動物吃:
for(Animal a : link) {
a.eat();
}
隨意評論,如果我錯過了什麼。
來源
2013-05-21 23:57:53
MAV
我發現很難理解你的問題是什麼。如果你的源代碼被格式化並且沒有語法錯誤(例如'... new ArrayList;'應該是... ...新的ArrayList ();'在末尾帶圓括號)。 –
Nick
我認爲答案是「是」。您可以使用一個接口作爲類型參數。一般來說,回答這種問題的最好方法就是自己嘗試。 – jpmc26
你錯過了很多可能有助於澄清的代碼。尼克建議清理它並完成它,也許我們可以提供幫助。你的代碼似乎不符合你的問題。實質上「我可以做到以下幾點:」將以「否」回答,因爲以下代碼不會吃任何鴨子,也不會從任何列表中刪除任何鴨子。 – galford13x