你的代码对我来说完全没有意义。我想我明白你想要什么。首先让我们看看你的代码。
你有一个很好的Goose实现类Animal。然后你有一个link在类中调用的列表:
public class Goose implements Animal{
List<Animal> link = new ArrayList<Animal>(); //remember ().
...
您班级的每个实例Goose都会有一个动物列表。这看起来很奇怪。不过,从这个问题来看,听起来您想要 1 个包含动物的列表,而不是每个列表中的列表Goose。
然后你有两个构造函数:
Goose(Duck d){
link.add(d);
}
Goose(Goose g){
link.add(g);
}
您需要将 aDuck或 aGoose作为输入添加到 new 的内部列表中Goose。这意味着每个新实例都将从其列表中的 aDuck或 a开始。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);
..
这样做你只能link在方法中使用列表main。您还可以使其成为包含的类的属性main以扩大范围。如果您需要全局访问,您可以创建一个包含它的单例public static类(或在某个地方创建,但我会推荐另一种方法)。
如果类正确实现了接口,您还可以将 a 添加Duck到列表中:DuckAnimal
link.add(new Duck());
如果Animal接口声明了一个名为的公共方法,eat您现在可以遍历列表并让所有动物吃掉:
for(Animal a : link) {
a.eat();
}
如果我错过了什么,请随时发表评论。