为什么在 java 中不允许这种沮丧?

Why is this downcast not allowed in java?

假设我有一个超类 Animal 和一个子类 Dog

我们可以这样说:

Animal a = new Dog();

我们不能沮丧地说:

Dog b = new Animal();

所以我明白动物不一定是狗。但是,为什么在狗容器中放置动物 "blueprint" 会引发异常?因为Dog继承了Animal的方法,所以当我们把这个animal放到一个dog容器中的时候,我们知道Dog inherits/overrides Animal有的所有方法,为什么Java不允许这样呢?

谢谢!

简答:因为狗是动物,但动物不一定是狗。

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

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

Animal 没有 interface/method 叫 Woof()。它不会像狗一样表现,但所有的狗都知道如何表现得像动物。

虽然知道Dog包含了Animal的所有方法,但不知道Animal包含了Dog的所有方法。

考虑例如 Dog 添加方法 bark()。我们应该能够在 Dog 类型的任何对象上调用 bark();但是如果我们可以在那里存储一个动物,我们就可以存储任何类型的动物,比如猫。然后我们会发现自己让猫叫 (),然后就会出现非常错误的情况。

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