Java参数多态性示例

pet*_*ter 0 java generics polymorphism

我有一个关于参数多态性的问题.如何确定实际类型并避免强制转换如果我有一个混合了子类型的集合.例如

    class Animal{

    }

    class Bird extends Animal{
          void fly(){}
    }

    class Dog extends Animal{
          void bark(){}
    }

    ArrayList<Animal> list = new ArrayList<Animal>();
Run Code Online (Sandbox Code Playgroud)

问题是当我迭代Animal集合时,我怎么知道哪一个是哪一个.我是否需要每次都使用instanceof来检查实际类型?

    for(Animal animal : list){
          if(animal instanceof Dog){
                ((Dog) animal).bark();
          } 
          else ((Bird) animal).fly();             
    }
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 6

如果你需要这样做,那意味着这是一个共同的行动.你通常会这样:

abstract class Animal {
     abstract void act();
}

class Bird extends Animal{
      void fly(){}
      void act(){
         fly();
      }
}

class Dog extends Animal{
      void bark(){}
      void act(){
         bark();
      }
}
Run Code Online (Sandbox Code Playgroud)

在你的循环中,你只需调用act方法:

for(Animal animal : list){
    animal.act();
}
Run Code Online (Sandbox Code Playgroud)