通用链表 - 如何添加不同的对象

时间:2015-02-05 14:46:38

标签: java generics linked-list

我创建了一个链表,但我似乎无法理解如何将不同的对象插入到同一个列表中。假设我有一个列表,我想要包含cat和dog类型的对象,这可能吗?我知道如何只插入猫,或只插入狗,但我似乎无法理解如何将两者插入到同一个列表中。

5 个答案:

答案 0 :(得分:2)

你想使用他们的"最低"公共类或通用接口,因此您可以尽可能多地(以及您需要)了解列表元素。

如果课程DogCat 都扩展了课程 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特定的或Dog特定的方法(在转回之前)。

当您使用列表中的对象时,具有良好的层次结构可以防止转换并促进多态性。你可以告诉我们在编译时从列表中检索到的对象,它们至少符合列表的泛型类型。

答案 1 :(得分:1)

如果CatDog没有任何共同点,您可以使用LinkedList参数化Object

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

这样您就可以同时添加CatDog,但请注意,每次从列表中检索对象时,这可能会强制您检查类型。

答案 2 :(得分: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());

OR

interface Animal {}

class Cat implements Animal{}

class Dog implements Animal{}

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

答案 3 :(得分:1)

由于您的列表可能包含某种相关的元素,因此最好创建一个接口并将其用作列表对象类型。

从IAnimal中导出Cat和Dog,并生成类型

的列表
List<IAnimal> animals = new YourList<IAnimal>();

答案 4 :(得分:0)

使用“通用”这个词时我会谨慎,特别是因为猫和狗不是通用的。

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