【问题标题】:Classes Hierarchy and Casting between Objects类层次结构和对象之间的转换
【发布时间】:2013-07-06 20:00:00
【问题描述】:

据我所知不可能将超类的对象转换为子类的对象。这会编译,但在运行时会返回错误。

更具体地说,给定以下类和接口层次结构:

。 Alpha 是 Beta 和 Gamma 的超类
. Gamma 是 Delta 和 Omega 的超类
.接口“In”由Beta和Delta实现

在这种情况下,我定义了以下代码:

Delta r;
Gamma q;

这对吗?

r = (Delta) q;

即使 Delta 是 Gamma 的子类,我也可以将 q 转换为 Delta 类型吗? 我认为这是不可能的,我的教科书另有说明。我已经搜索了很多,根据this 我是对的,这是教科书上的错误。

我错过了什么吗?

【问题讨论】:

    标签: java casting


    【解决方案1】:

    这是合法的:

    Gamma q = new Delta();
    Delta d = (Delta)q;
    

    这将编译但会给你一个运行时错误:

    Gamma q = new Gamma();
    Delta d = (Delta)q;
    

    在第一种情况下,qDelta,因此您可以将其转换为 Delta。在第二种情况下,qGamma,因此您不能将其大小写为 Delta.

    Gamma 变量 可以引用Gamma 对象 或作为Gamma 子类的对象,例如Delta 对象;当您将Gamma 转换为Delta 时,您是在告诉编译器Gamma 变量引用Delta 对象或Delta 子类的对象(如果您错了然后你会得到一个ClassCastException)。对象本身的类型是不可变的 - 您不能在运行时将 Gamma 对象的类型更改为 Delta 对象,因此如果 Gamma 变量实际上引用了 Gamma 对象,但您随后尝试强制转换将其添加到 Delta 对象,然后您将获得运行时异常。

    【讨论】:

    • 我也有同样的想法,但你打败了我。 +1
    • 仅供参考:这本书指的是答案中提到的第二种情况。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    相关资源
    最近更新 更多