【发布时间】:2012-11-15 19:39:57
【问题描述】:
我有一个关于参数多态性的问题。如果我有一个混合了子类型的集合,如何确定实际类型并避免强制转换。例如
class Animal{
}
class Bird extends Animal{
void fly(){}
}
class Dog extends Animal{
void bark(){}
}
ArrayList<Animal> list = new ArrayList<Animal>();
问题是当我遍历 Animal 集合时如何知道哪个是哪个。每次都需要用instanceof来检查实际类型吗?
for(Animal animal : list){
if(animal instanceof Dog){
((Dog) animal).bark();
}
else ((Bird) animal).fly();
}
【问题讨论】:
-
理想情况下,您将对可以在基类中声明并在子类中覆盖的每个项目执行类似的操作(例如
speak())。那么你不需要担心类型。如果您按原样继续,那么是的,您需要强制转换以调用该方法。 (我有意识地排除了使用反射调用方法的选项) -
除非将
bark()和fly()移至超类Animal,否则无法避免。
标签: java generics polymorphism