我有一节课,让我们说 - Animal
。还有一些继承自它的课程,让我们说:Bird
,Cat
,Dog
。
现在我创建一个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
课程中实现该方法似乎解决了这个问题,但是当我不得不这样做时,它会伤到我的眼睛。有没有办法解决这个问题?
答案 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方法,所以,铸造是必要的。 ......