Java:从超类列表中获取子类

Java:从超类列表中获取子类,java,subclass,superclass,Java,Subclass,Superclass,我是java新手,对以下代码有两个问题: 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.

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

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*/ );
  }
}
类动物{}
类狗扩展动物{}
类Cat扩展了动物{}
类老鼠扩展动物{}
班长{
列出动物=新建ArrayList();
公共void main(字符串[]参数){
添加(新狗());
添加(新鼠());
添加(新狗());
添加(新的Cat());
添加(新鼠());
添加(新的Cat());
List cats=getCertainAnimals(/*一些参数指定我只需要cat实例*/);
}
}
1) 有没有办法从Aminal列表中获取狗或猫的实例? 2) 如果是,我应该如何正确构建getCertainAnimals方法

Animal a = animals.get(i);   

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

注意:如果您不使用
instanceof
,它将编译,但它也允许您将
a
投射到
Cat
,即使
a
老鼠
。尽管进行了编译,但在运行时仍会得到一个
ClassCastException
。因此,请确保使用
instanceof

您可以执行以下操作

    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 is a Dog
Animal is a Cat

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

使用instanceof运算符。使用instanceof()来获取类的类型:)谢谢,它帮了我很多忙!没问题。欢迎来到SO。你应该坐飞机。
Animal is a Dog
Animal is a Cat