我有以下课程:
Class Dog extends Animal
Class Cat extends Animal
Class Mouse extends Animal
此外,我有一个List
,我将Animal
放在每个List<? extends Animal> list = new ArrayList<? extends Animal>();
中,无论子类如何:
Dogs
使用Cats
填充所述列表,Mice
和Animal
完美无缺,除非我想稍后查看列表中的for (Animal animal: list) {
if (animal instanceof Dog) {
//do some dog stuff
}
if (animal instanceof Cat) {
// do some cat stuff
}
}
类型。
{{1}}
如何查看列表中的每只动物是狗,猫还是鼠标?
答案 0 :(得分:0)
如果您想避免多次instanceof
次检查,可以让Dog
,Cat
和Mouse
派生自公共超类Mammal
(它本身会是Animal
)的子类。然后你只需要检查:
if (animal instanceof Mammal) { }
更清洁解决方案是将处理移动到一个方法,您为每种类型的Animal
覆盖:
abstract class Animal { public abstract void feed (); } class Dog extends Animal { public void feed() { // feed the dog } }
答案 1 :(得分:0)
<? extends Animal>
之类的通配符非常有用,但您不知道或不关心它是什么是
ArrayList<Dog>
或ArrayList<Cat>
等。
但是,由于您似乎在列表中添加了各种元素,因此您可以在ArrayList <Animal>
中添加Dog
s,Cat
或者有你,因为它们来自Animal
因此他们是 Animal
。
我建议在超类中添加一个多态方法而不是instanceof
检查,而是在所有子类中重写它,以便以后可以调用它而无需关心实际对象的类型。< / p>