Общий связанный список - как добавлять различные объекты

1

Я создал связанный список, но я не могу понять, как вставлять разные объекты в один список. Скажите, у меня есть список, который я хочу содержать оба объекта типа cat и dog, возможно ли это? Я знаю, как вставлять только кошек или только собак, но я не могу понять, как вставлять их в один список.

Теги:
generics
linked-list

5 ответов

2
Лучший ответ

Вы хотите использовать свой "самый низкий" общий класс или общий интерфейс, чтобы вы могли как можно больше (и что вам нужно) рассказать о элементах списка.

Если оба класса Dog и Cat расширят класс Animal, и вы хотите представить список животных, вы можете сделать:

List<Animal> animals = new YourList<Animal>();
for (Animal animal: animals){
    // use some Animal method
    animal.eat();
}

Если оба из них реализуют интерфейс TailOwner и вы хотите использовать операции с этим интерфейсом для членов списка, вы можете сделать:

List<TailOwner> tailOwners = new YourList<TailOwner>();
for (TailOwner tailOwner: tailOwners){
    // use some TailOwner method
    tailOwner.wiggle();
}

Если вы не уверены, вы всегда можете вернуться к Object, поскольку все классы Java расширяют его:

List<Object> objects = new YourList<Object>();
for (Object object: objects){
    // use some Object method
    System.out.println(tailOwner.toString());
}

Обычно, когда у вас есть два объекта в одном списке, у них есть что-то общее.

В любом случае, вы отказываетесь от каких-либо методов Cat -specific или Dog -specific (прежде чем возвращаться к ним), когда вы поместите их в список.

Наличие хорошей иерархии может предотвратить литье и способствовать полиморфизму, когда вы используете объекты из списка. Все, что вы можете сказать об объектах, извлеченных из списка во время компиляции, состоит в том, что они, по крайней мере, соответствуют типу списка.

1

Вы можете добавлять элементы, которые implements один и тот же интерфейс, или extends один и тот же класс.

class Animal {}

class Cat extends Animal{}

class Dog extends Animal{}

List<Animal> animals = new LinkedList<Animal>;
animals.add(new Cat());
animals.add(new Dog());

ИЛИ

interface Animal {}

class Cat implements Animal{}

class Dog implements Animal{}

List<Animal> animals = new LinkedList<Animal>;
animals.add(new Cat());
animals.add(new Dog());
1

Поскольку ваш список, вероятно, содержит элементы, которые каким-то образом связаны, было бы лучше сделать интерфейс и использовать его как тип списка.

Выведите и Cat и Dog из IAnimal и создайте список типов

List<IAnimal> animals = new YourList<IAnimal>();
1

Если у Cat и Dog нет ничего общего, вы можете параметризовать LinkedList с Object:

List<Object> list = new LinkedList<Object>();

Таким образом, вы сможете добавить Cat и Dog, но обратите внимание, что это может заставлять вас проверять типы каждый раз, когда вы извлекаете объекты из списка.

0

Я был бы осторожен при использовании слова generic, тем более что кошка и собака не являются общими.

LinkedList<Object> linkedlist = new LinkedList<Object>();
linkedList.add(new Dog());
linkedList.add(new Cat());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню