对象之间的类层次结构和转换

时间:2013-07-06 20:00:01

标签: java casting

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

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

。 Alpha是Beta和Gamma的超类 。 Gamma是Delta和Omega的超级品牌 。接口“In”由Beta和Delta

实现

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

Delta r;
Gamma q;

这是对的吗?

r = (Delta) q;

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

我错过了什么吗?

1 个答案:

答案 0 :(得分:5)

这是合法的:

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 1}}(如果你错了,你会得到一个Gamma)。对象本身的类型是不可变的 - 您不能在运行时将Delta对象的类型更改为Gamma对象,因此如果Gamma变量实际引用Delta }然后你尝试将它强制转换为{{1}}对象,然后你就会得到一个运行时异常。