检查Java中的子类

时间:2014-02-09 23:36:00

标签: java generics polymorphism

我有以下课程:

Class Dog extends Animal
Class Cat extends Animal
Class Mouse extends Animal

此外,我有一个List,我将Animal放在每个List<? extends Animal> list = new ArrayList<? extends Animal>(); 中,无论子类如何:

Dogs

使用Cats填充所述列表,MiceAnimal完美无缺,除非我想稍后查看列表中的for (Animal animal: list) { if (animal instanceof Dog) { //do some dog stuff } if (animal instanceof Cat) { // do some cat stuff } } 类型。

{{1}}

如何查看列表中的每只动物是狗,猫还是鼠标?

2 个答案:

答案 0 :(得分:0)

如果您想避免多次instanceof次检查,可以让DogCatMouse派生自公共超类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)

当您的列表包含派生类型(即Cat / Dog等)的元素时,

<? extends Animal>之类的通配符非常有用,但您不知道或不关心它是什么是。制作它们时,如果您在方法中以通用方式使用它们,它们会匹配ArrayList<Dog>ArrayList<Cat>等。

但是,由于您似乎在列表中添加了各种元素,因此您可以在ArrayList <Animal>中添加Dog s,Cat或者有你,因为它们来自Animal因此他们 Animal

我建议在超类中添加一个多态方法而不是instanceof检查,而是在所有子类中重写它,以便以后可以调用它而无需关心实际对象的类型。< / p>