据我所知,不可能将超类的Object强制转换为子类的Object 。这将编译,但在运行时它将返回错误。
更具体地说,给定以下层次的类和接口:
。 Alpha是Beta和Gamma的超类 。 Gamma是Delta和Omega的超级品牌 。接口“In”由Beta和Delta
实现在这种情况下,我定义了以下代码:
Delta r;
Gamma q;
这是对的吗?
r = (Delta) q;
即使Delta是Gamma的子类,我可以将q转换为Delta吗? 我认为这是不可能的,我的教科书另有说法。我已经搜索了很多,根据this我是对的,这是教科书中的一个错误。
我错过了什么吗?
答案 0 :(得分:5)
这是合法的:
Gamma q = new Delta();
Delta d = (Delta)q;
这将编译,但会给你一个运行时错误:
Gamma q = new Gamma();
Delta d = (Delta)q;
在第一种情况下,q
是Delta
,因此您可以将其投放到Delta
。在第二种情况下,q
是Gamma
,因此您无法将其置于Delta.
Gamma
变量可以引用Gamma
对象或引用Gamma
的子类的对象,例如一个Delta
个对象;当您将Gamma
强制转换为Delta
时,您告诉编译器Gamma
变量引用Delta
对象或Delta
对象的子类ClassCastException
1}}(如果你错了,你会得到一个Gamma
)。对象本身的类型是不可变的 - 您不能在运行时将Delta
对象的类型更改为Gamma
对象,因此如果Gamma
变量实际引用Delta
}然后你尝试将它强制转换为{{1}}对象,然后你就会得到一个运行时异常。