为什么在java中不允许这种贬低?

假设我有一个 Animal 的超类,以及 Dog 的子类 .

我们可以说:

Animal a = new Dog();

我们不能低声说:

Dog b = new Animal();

所以我明白动物不一定是狗 . 但是,为什么在狗容器中有动物“蓝图”会抛出异常呢?因为Dog继承了Animal的方法,当我们把这种动物放入狗容器中时,我们知道Dog继承/覆盖了Animal所有的方法,那为什么Java不允许这样呢?

谢谢!

回答(3)

3 years ago

Dog b = new Animal();
b.Woof();

Animal没有名为Woof()的接口/方法 . 它不知道如何像狗一样行事,但所有的狗都知道如何像动物一样行事 .

3 years ago

简短回答:因为狗是动物,但动物不一定是狗 .

稍微长一点的回答:如果你能够做到这一点,你可以在 Animal 对象上调用 Dog 方法,这些方法不一定定义那些方法 .

3 years ago

虽然我们知道Dog包含Animal的所有方法,但我们不知道Animal包含Dog的所有方法 .

例如,如果Dog添加了方法bark() . 我们应该能够在Dog类型的任何对象上调用bark();但如果我们可以在那里存放动物,我们可以存储任何类型的动物,比如说Cat . 然后我们发现自己要求一只猫吠(),而且会出现问题 .

我们可以说狗是动物,猫是动物,但我们不能说动物是狗,或者猫是狗 . 因此,如果我们的变量"is a Dog",存储一个Animal就没有意义了 .