通用链表 - 如何添加不同的对象
Generic linked list - how to add different objects
我已经创建了一个链表,但我似乎无法理解如何将不同的对象插入到同一个链表中。假设我有一个列表,我想包含猫和狗类型的对象,这可能吗?我知道如何只插入猫或狗,但我似乎无法理解如何将两者插入同一个列表。
如果 Cat
和 Dog
没有共同点,您可以用 Object
:
参数化 LinkedList
List<Object> list = new LinkedList<Object>();
这样您就可以同时添加 Cat
和 Dog
,但请注意,这可能会强制您在每次从列表中检索对象时检查类型。
您想使用他们的 "lowest" 通用 class 或通用接口,这样您就可以尽可能多地(以及您需要的)了解列表的元素。
如果 classes Dog
和 Cat
都扩展了 class 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 class 都会扩展它:
List<Object> objects = new YourList<Object>();
for (Object object: objects){
// use some Object method
System.out.println(tailOwner.toString());
}
通常,当您在同一个列表中有两个对象时,它们确实有 某些 共同点。
无论哪种方式,当您将它们放入列表时,您将放弃任何 Cat
特定或 Dog
特定的方法(在转换回任一方法之前)。
当您使用列表中的对象时,拥有良好的层次结构可以防止转换并促进多态性。关于编译时从列表中检索到的对象,您只能说它们至少符合列表的通用类型。
我会谨慎使用通用这个词,尤其是因为猫和狗不是通用的。
LinkedList<Object> linkedlist = new LinkedList<Object>();
linkedList.add(new Dog());
linkedList.add(new Cat());
您只能添加 implements
相同界面或 extends
相同 class 的元素。
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());
由于您的列表可能包含以某种方式相关的元素,因此最好创建一个接口并将其用作列表对象类型。
从 IAnimal 派生 Cat 和 Dog 并制作类型列表
List<IAnimal> animals = new YourList<IAnimal>();
我已经创建了一个链表,但我似乎无法理解如何将不同的对象插入到同一个链表中。假设我有一个列表,我想包含猫和狗类型的对象,这可能吗?我知道如何只插入猫或狗,但我似乎无法理解如何将两者插入同一个列表。
如果 Cat
和 Dog
没有共同点,您可以用 Object
:
LinkedList
List<Object> list = new LinkedList<Object>();
这样您就可以同时添加 Cat
和 Dog
,但请注意,这可能会强制您在每次从列表中检索对象时检查类型。
您想使用他们的 "lowest" 通用 class 或通用接口,这样您就可以尽可能多地(以及您需要的)了解列表的元素。
如果 classes Dog
和 Cat
都扩展了 class 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 class 都会扩展它:
List<Object> objects = new YourList<Object>();
for (Object object: objects){
// use some Object method
System.out.println(tailOwner.toString());
}
通常,当您在同一个列表中有两个对象时,它们确实有 某些 共同点。
无论哪种方式,当您将它们放入列表时,您将放弃任何 Cat
特定或 Dog
特定的方法(在转换回任一方法之前)。
当您使用列表中的对象时,拥有良好的层次结构可以防止转换并促进多态性。关于编译时从列表中检索到的对象,您只能说它们至少符合列表的通用类型。
我会谨慎使用通用这个词,尤其是因为猫和狗不是通用的。
LinkedList<Object> linkedlist = new LinkedList<Object>();
linkedList.add(new Dog());
linkedList.add(new Cat());
您只能添加 implements
相同界面或 extends
相同 class 的元素。
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());
由于您的列表可能包含以某种方式相关的元素,因此最好创建一个接口并将其用作列表对象类型。
从 IAnimal 派生 Cat 和 Dog 并制作类型列表
List<IAnimal> animals = new YourList<IAnimal>();