【问题标题】:why i can not cast parent to child some specific scenario为什么我不能在某些特定情况下将父母投射到孩子身上
【发布时间】:2021-09-09 02:28:19
【问题描述】:

我有两个班级,一个动物和一个熊。 示例代码

class Animal {}
class Bear extends Animal {}

当我写代码时

Animal animal = new Bear();
Bear bear = (Bear) animal;

我也知道第一个是向上转换,第二个是向下转换并且工作正常。

但我的问题是当我编写如下代码时:

Animal animal = new Animal();
Bear bear = (Bear) animal;

它通过ClassCastException

我想知道为什么会这样。

【问题讨论】:

    标签: java inheritance types casting polymorphism


    【解决方案1】:

    Java 中的强制转换不能更改对象类型。它只是告诉编译器将某个对象视为某种类型是可以的,因为在运行时会出现这种情况。

    在第一个示例中,bear 确实是 Bear 实例,因此转换工作正常。
    在第二个例子中,它不是,所以你得到一个ClassCastException

    【讨论】:

      【解决方案2】:

      如果Bear 类型的第23 个方法是growl,并且bear 是函数中的第5 个局部变量,Java 编译器会将bear.growl() 转换为“执行局部变量#5 的方法#23” .如果对象实际上是类Bear 的实例或派生类型是方法#23 是growl(),这样的翻译会很好,但如果引用是某种没有@987654327 的类型,则可能是灾难性的@ 作为方法#23。如果对象没有方法 #23,则 JVM 可能能够在函数调用时捕获此类问题,但如果对象是例如,则不太可能捕获它们。一个Dragon,其方法#23 是breatheFire()。与其要求每次尝试对Bear 类型的变量使用方法growl,不如检查以确保对象实际上具有growl 作为方法#23,Java 禁止存储方法#23 不是@987654333 的任何引用@ 转换为 bear 类型的变量。

      【讨论】:

        【解决方案3】:
        Animal animal = new Animal();
        Bear bear = (Bear) animal;
        

        这是因为您的父类不知道您孩子的属性和方法。 在第一行中,您只是创建了一个 animal 对象,仅此而已。如果要强制转换此动物引用,则必须将子对象分配给它,以便您的父引用也知道子对象的属性和方法。 这必须替换为

        Animal animal = new Bear();
        Bear bear = (Bear) animal;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-26
          • 2019-12-18
          • 2021-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-27
          相关资源
          最近更新 更多