从超类对象列表中获取子类

时间:2014-04-21 20:41:10

标签: java

我有一节课,让我们说 - Animal。还有一些继承自它的课程,让我们说:BirdCatDog

现在我创建一个Animal类型的数组列表,并向其添加一些子类实例。

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

然后我遍历这个列表,调用一些方法等等。

for(int i = 0; i < list.length; i++)
{
   list.get(i).makeSound();
}

精细。但是,如果我想在Bird子类中添加一个不会在Animal超类中实现的方法,该怎么办?让我们说fly()方法,所以它看起来像这样:

for(int i = 0; i < list.length; i++)
{
   list.get(i).makeSound();
   if(list.get(i) instanceof Bird)
   {
      list.get(i).fly(); // error here
   }
}

这是有道理的,但它会引发错误 - 无法找到符号。在Animal课程中实现该方法似乎解决了这个问题,但是当我不得不这样做时,它会伤到我的眼睛。有没有办法解决这个问题?

4 个答案:

答案 0 :(得分:2)

你需要施展到Bird

((Bird)list.get(i)).fly(); 

答案 1 :(得分:1)

如果您已经确定它是Bird,那么您可以将Animal转换为Bird,这样您就可以拨打fly()。< / p>

if(list.get(i) instanceof Bird)
{
   Bird bird = (Bird) list.get(i);
   bird.fly();
}

答案 2 :(得分:0)

你想要&#39;演员&#39;回到鸟的实例。

if(list.get(i) instanceof Bird)
{
    Bird bird = ((Bird) list.get(i));
}

我还会将你的循环重写为每个&#39;循环:

for(Animal animal : list)
{
   animal.makeSound();
   if(animal instanceof Bird)
   {
      ((Bird) animal).fly(); 
   }
}

答案 3 :(得分:0)

它是一个动物引用数组,只有你知道引用实际指向的是什么,需要让编译器知道通过转换...在编译时编译器会检查动物。类文件,看看是否有一个makeNoise metbod,如果有它不会抛出错误,在运行时它会跟随动物引用amd看看它实际指向的是什么并调用类makeNoise metbod,正如你所说的那样你的动物类中没有makeNoise方法,所以,铸造是必要的。 ......

相关问题