在保持多态属性的同时创建一个超类数组

duk*_*vin 0 java arrays polymorphism arraylist

如果我在运行时填充了一系列Birds,那么如何访问特定于子类的成员方法?

class Bird
{
  public Bird() {}
  public void fly(int x) {
     System.out.println("Flew "+x+" meters");
  }
}
class DumbBird extends Bird
{
   public DumbBird() {super();}
   public void fly(int x) {
     x-=5; //we're dumb
     System.out.println("Flew "+x+" meters");
   }
   public void sing() {
      System.out.println("La la la!");
   }
}
public static void main(String[] args)
{
   Bird[] cage = new Bird[10];
   cage[0] = new Bird();
   cage[1] = new Dumbbird();
   cage[2] = new Sleepybird();
   //.... more bird types

   cage[1].sing(); //is inaccessable because it is of type Bird not DumbBird!
}
Run Code Online (Sandbox Code Playgroud)

有没有一种很好的方法能够拥有一个泛型类型数组,同时能够访问特定于子类的成员函数?我想不必编辑Bird类.

Dog*_*ogs 5

从理论上讲,是的.放入数组的项目是可以恢复的,因此您可以确定要查看的类型,并将特定对象强制转换为实际类型.但这不是一个非常干净的解决方案,所以我不推荐它.

您可以考虑使用一个抽象类或接口来代表鸟,它具有大多数鸟类会支持的方法,以及检查方法canSing()canFly().UnsupportedOperationException如果你试图调用鸟不支持的方法,那些不支持此类的鸟类如不会飞的鸟类可以扔掉它,但是没有简单的方法来一般地引用所有的鸟类,并且知道每种方法的所有不同方法子类型的鸟可以有.