3

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

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

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

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

Delta r;
Gamma q;

它是否正确?

r = (Delta) q;

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

我错过了什么吗?

4

1 回答 1

5

这是合法的:

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

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

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

在第一种情况下,qis a Delta,因此您可以将其强制转换为 a Delta。在第二种情况下,q是 a Gamma,因此您不能将其大小写为 aDelta.

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

于 2013-07-06T20:03:52.790 回答