【问题标题】:Class Casting Exception in JavaJava中的类转换异常
【发布时间】:2012-01-27 18:53:37
【问题描述】:

我在相互转换类时遇到问题。

要更详细地解释它,请看这张图片。

在我的代码中,我执行SkillBase s = new SkillBase();,然后在该类中设置一些值。 然后我尝试做Subclass sub = (Subclass)s;,但是运行它时它会给出一个ClassCastException。

我添加了一个小的调试部分,它检查是否返回 true 的 instanceof

我试过谷歌,在这里也看到了一些问题并阅读了它们(他们都没有适合我的答案)

那么,我该怎么办?

【问题讨论】:

    标签: java class exception casting classcastexception


    【解决方案1】:

    SkillBase 不是Subclass 的实例,那么为什么你认为强制转换会起作用?试试这个:

    SkillBase s = new Subclass();
    Subclass sub = (Subclass)s;
    

    这将成功。另外我认为instanceof 不正确,我确信:

    s instanceof Subclass
    

    在上面的代码中产生true,但在你的情况下产生false

    从现实世界的角度思考:您始终可以将 Dog 转换为 Animal,因为每只狗都是动物*,但将 Animal 转换为 Dog 可能会失败,因为有些动物不是不是狗。

    * 实际上,编译器会为你做这件事,它被称为多态性

    【讨论】:

    • 其实我就是这么做的。子类扩展了 SkillBase,所以它应该是可转换的吧?
    • 添加:Subclass 是一个 SkillBase。反之则为真。您不能将父类强制转换为子类。
    • @Lolmewn:我添加了一些现实生活中的例子,看看。
    • 编辑后我明白了 :) 非常感谢,我会做一些重新分解!
    【解决方案2】:

    您只能向上转换,即将子类分配给超类引用。可以这样想:Subclass 通过添加新方法 f() 扩展了 Superclass。现在Superclass 不知道关于 f() 的任何事情,因此是问题所在。

    【讨论】:

      【解决方案3】:

      你可能用错了instanceof

      运行时崩溃是正确的,因为SkillBase 不是Subclass

      反之亦然。

      【讨论】:

        【解决方案4】:

        s 不能转换为子类,因为它没有被实例化为子类。这是一个技能库。如果您想使用子类,为什么不直接实例化它?

        Subclass s = new Subclass();
        

        您仍然可以设置所需的参数,因为它们已被 Skillbase 继承,并且不再需要强制转换。

        【讨论】:

        • 因为我处于一个 for 循环中,并且必须在执行其余操作之前检查我正在查看的内容,但如果其他内容失败,这似乎是一个不错的选择。
        【解决方案5】:

        问题是您没有正确使用强制转换。一个类总是可以被转换为它的父类,但不能反过来。这个概念是子类(根据定义)知道父类的结构,并且(根据定义)已经支持父类中的所有签名。因此,父级是子级的子集。

        然而,反之则不成立。父类对子类和/或子类是否在其结构中添加了额外的签名一无所知。因此,无法告诉编译器将父级视为子级,并使子级在父级中拥有的所有方法都可用。

        通俗地说,水(子)是液体(父),但并非所有液体都是水。因此,您想要对液体进行的任何测量(即:数量、粘度等)也适用于水,但反之则不然(例如:水的密度与油的密度完全不同)。

        因此,要让这一切回到您的情况,您可以将 Subclass 转换为 Skillbase,但不能反过来。

        Subclass instanceof Skillbase == true
        (Skillbase) new Subclass() - also valid
        (SKillbase) new Sub#2 - also valid
        

        等等……

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多