Java:如何拥有子类类型的数组?

Mic*_*ron 6 java arrays inheritance subclass superclass

假设我有一个超类“Animal”和子类“Cat”、Dog、Bird“。有没有办法拥有子类类型数组而不是类实例,我可以用它来实例化每个可能的子类的实例?

为了简单起见,我想要这个:

Pseudo code: For each possible subclass of "Animal": create an instance of that class.
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑:我不需要这些子类的实例数组,我想要一个对象类型的数组。

Ani*_*kur 7

您可以使用多态来实现这一点。

Animal[] animalArray = new Animal[10];
animalArray[0] = new Dog();
animalArray[1] = new Cat();
Run Code Online (Sandbox Code Playgroud)

基本上都是动物类的所有子类。当您想要检索对象时,您只需将其键入即可

Dog dog = (Dog)animalArray[0];
Run Code Online (Sandbox Code Playgroud)

要了解该类,您可以简单地使用 getClass() 方法。例如

    Animal[] animalArray = new Animal[10];
    animalArray[0] = new Dog();
    System.out.println(animalArray[0].getClass());
Run Code Online (Sandbox Code Playgroud)

将打印class Dog.


Fre*_*eak 3

在OP的评论之后,即使使用反射也
没有办法获取类的所有子类型
但你可以用另一种方式来做,你可以说这是唯一但最长的方式。

  • 获取类路径上存在的所有类的名称列表
  • 加载每个类并测试它是否是所需类或接口的子类或实现者



在OP评论之前回答

由于您的问题尚不清楚,但我猜您想使用 array 或 Collection 来存储所有实例,即使它是 or 的superclass实例subclass
那么我想你需要这样做。

List<Object> list = new ArrayList<Object>();
         list.add(new Cat());
         list.add(new Dog());
         list.add(new Animal());
         list.add(new Cat());

         for (int i = 0; i < list.size(); i++) {

             if(list.get(i) instanceof Cat){
                 System.out.println("Cat at "+i);
             }else if(list.get(i) instanceof Dog){
                 System.out.println("Dog at "+i);
             }else if(list.get(i) instanceof Animal){
                 System.out.println("Animal at "+i);
             }
        }
Run Code Online (Sandbox Code Playgroud)

此代码经过测试
注意:请记住,不要像示例代码那样将父类检查放在 (list.get(i) instanceof Animal)顶部,否则它将通过两种情况(如果检查仅是 if-if-if)或跳过一种情况(并且始终如果检查是 if-else if-else if)(list.get(i) instanceof Animal)并且(list.get(i) instanceof Cat)返回的对象是 Cat 对象,则将对象作为 Animal 返回。