我有一个关于参数多态性的问题。如果我有一个混合了子类型的集合,如何确定实际类型并避免强制转换。例如
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();
}
最佳答案
如果您需要执行此操作,则意味着这是一个常见操作。你通常会有这样的:
abstract class Animal {
abstract void act();
}
class Bird extends Animal{
void fly(){}
void act(){
fly();
}
}
class Dog extends Animal{
void bark(){}
void act(){
bark();
}
}
在循环中,您只需调用 act
方法:
for(Animal animal : list){
animal.act();
}
关于Java参数多态示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13404865/