Я создал связанный список, но я не могу понять, как вставлять разные объекты в один список. Скажите, у меня есть список, который я хочу содержать оба объекта типа cat и dog, возможно ли это? Я знаю, как вставлять только кошек или только собак, но я не могу понять, как вставлять их в один список.
Вы хотите использовать свой "самый низкий" общий класс или общий интерфейс, чтобы вы могли как можно больше (и что вам нужно) рассказать о элементах списка.
Если оба класса 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 (прежде чем возвращаться к ним), когда вы поместите их в список.
Наличие хорошей иерархии может предотвратить литье и способствовать полиморфизму, когда вы используете объекты из списка. Все, что вы можете сказать об объектах, извлеченных из списка во время компиляции, состоит в том, что они, по крайней мере, соответствуют типу списка.
Вы можете добавлять элементы, которые 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());
Поскольку ваш список, вероятно, содержит элементы, которые каким-то образом связаны, было бы лучше сделать интерфейс и использовать его как тип списка.
Выведите и Cat и Dog из IAnimal и создайте список типов
List<IAnimal> animals = new YourList<IAnimal>();
Если у Cat
и Dog
нет ничего общего, вы можете параметризовать LinkedList
с Object
:
List<Object> list = new LinkedList<Object>();
Таким образом, вы сможете добавить Cat
и Dog
, но обратите внимание, что это может заставлять вас проверять типы каждый раз, когда вы извлекаете объекты из списка.
Я был бы осторожен при использовании слова generic, тем более что кошка и собака не являются общими.
LinkedList<Object> linkedlist = new LinkedList<Object>();
linkedList.add(new Dog());
linkedList.add(new Cat());