【问题标题】:Java: Getting the subclass from a superclass listJava:从超类列表中获取子类
【发布时间】:2013-07-20 17:21:38
【问题描述】:

我是 java 新手,对以下代码有 2 个问题:

class Animal { }
class Dog extends Animal { }
class Cat extends Animal { }
class Rat extends Animal { }

class Main {
  List<Animal> animals = new ArrayList<Animal>();

  public void main(String[] args) {
    animals.add(new Dog());
    animals.add(new Rat());
    animals.add(new Dog());
    animals.add(new Cat());
    animals.add(new Rat());
    animals.add(new Cat());

    List<Animal> cats = getCertainAnimals( /*some parameter specifying that i want only the cat instances*/ );
  }
}

1) 有没有办法从 Aminal 列表中获取 Dog 或 Cat 实例? 2) 如果是,我应该如何正确构建 getCertainAnimals 方法?

【问题讨论】:

标签: java subclass superclass


【解决方案1】:
Animal a = animals.get(i);   

if  (a instanceof Cat)
{
    Cat c = (Cat) a;
} 
else if (a instanceof Dog)
{
    Dog d = (Dog) a;
} 

注意:如果你不使用instanceof,它将编译,但它也允许你将a转换为CatDog,即使aRat。尽管编译,你会在运行时得到一个ClassCastException。所以,请务必使用instanceof

【讨论】:

  • 谢谢,对我帮助很大!
  • 没问题。欢迎来到 SO。您应该使用tour
【解决方案2】:

您可以执行以下操作

    List<Animal> animalList = new ArrayList<Animal>();
    animalList.add(new Dog());
    animalList.add(new Cat());
    for(Animal animal : animalList) {
        if(animal instanceof  Dog) {
            System.out.println("Animal is a Dog");
        }
        else if(animal instanceof  Cat) {;
            System.out.println("Animal is a Cat");
        }
        else {
            System.out.println("Not a known animal." + animal.getClass() + " must extend class Animal");
        }
    }

您还可以检查 Animal 的类并将其与 Animal 子类进行比较。如

for(Animal animal : animalList) {
    if(animal.getClass().equals(Dog.class)) {
        System.out.println("Animal is a Dog");
    }
    else if(animal.getClass().equals(Cat.class)) {;
        System.out.println("Animal is a Cat");
    }
    else {
        System.out.println("Not a known animal." + animal.getClass() + " must extend class Animal");
    }
}

在这两种情况下,您都会得到输出为

Animal is a Dog
Animal is a Cat

基本上两者都做同样的事情。只是为了让您更好地理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    相关资源
    最近更新 更多