Ваш код не имеет для меня никакого смысла. Думаю, я понимаю, что ты хочешь. Сначала давайте рассмотрим ваш код.
У вас есть класс 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);
}
Вам потребуется либо 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);
..
Делая это, вы можете использовать только список link
в методе main
. Вы также можете сделать это свойством класса, содержащего main
, чтобы расширить область действия. Если вам нужен глобальный доступ, вы можете сделать класс singleton, который его содержит (или сделать его public static
где-нибудь, но я бы рекомендовал другой подход).
Вы также можете добавить Duck
в список, если Duck
класс реализует Animal
интерфейс правильно:
link.add(new Duck());
Если интерфейс Animal
объявляет открытый метод, называемый eat
теперь вы можете перебирать список и сделать все животные едят:
for(Animal a : link) {
a.eat();
}
Не стесняйтесь прокомментировать, если я что-то пропустил.
Мне сложно понять, в чем ваш вопрос. Это также помогло бы потенциальным ответчикам, если бы ваш исходный код был отформатирован и не имел синтаксических ошибок (например, «... новый ArrayList;' должен быть '... новым ArrayList ();' с круглыми скобками в конце). –
Nick
Я думаю, что ответ «да». Вы можете использовать интерфейс как параметр типа. Вообще говоря, лучший способ ответить на этот вопрос - это просто попробовать себя. – jpmc26
Вам не хватает большого количества кода, который может помочь прояснить. Поскольку Ник предложил очистить его и завершить, и, возможно, мы сможем помочь. Ваш код, похоже, не соответствует вашему вопросу. По существу «Могу ли я сделать следующее:» ответят «Нет», поскольку следующий код не ест уток и не удаляет уток из каких-либо списков. – galford13x