【问题标题】:Why is this downcast not allowed in java?为什么在 java 中不允许这种向下转换?
【发布时间】:2015-04-27 23:48:57
【问题描述】:

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

我们可以说:

Animal a = new Dog();

我们不能沮丧地说:

Dog b = new Animal();

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

谢谢!

【问题讨论】:

  • 想一想,当你说动物时,你不能自动假设它是一只狗。但你可以反过来

标签: java oop polymorphism downcast


【解决方案1】:
Dog b = new Animal();
b.Woof();

Animal 没有称为 Woof() 的接口/方法。它不知道如何表现得像狗,但所有的狗都知道如何表现得像动物。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      例如,如果 Dog 添加了一个方法 bark()。我们应该能够对任何 Dog 类型的对象调用 bark();但是如果我们可以在那里存储一个动物,我们可以存储任何类型的动物,比如猫。然后我们会发现自己让 Cat 来 bark(),结果会出问题。

      我们可以说狗动物,猫动物,但是我们不能说动物 em> 狗,或者说猫 狗。因此,如果我们的变量“是一只狗”,那么在其中存储一个动物是没有意义的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-10
        • 2013-04-23
        • 2012-10-27
        • 2014-12-02
        • 2021-10-13
        • 2023-03-31
        • 2011-08-17
        • 2014-04-18
        相关资源
        最近更新 更多