interface Foo {}
class Alpha implements Foo {}
class Beta extends Alpha {}
class Delta extends Beta {
public static void main( String[] args ) {
Beta x = new Beta();
Foo f=(Delta) x;
}
}
为什么ClassCastException
出现在这里?
答案 0 :(得分:6)
用简单英语编写代码:
富
Alpha IS-A Foo
Beta IS-A Alpha
Delta IS-A Beta
Beta IS-NOT Delta
在此处更改行;
Foo f = (Delta) x;
希望这会有所帮助。如果您有任何问题,请告诉我。
答案 1 :(得分:2)
您收到的ClassCastException
符合JLS §5.5.3:
这是一个算法,用于检查对象的运行时类型
R
是否与类型为T
的赋值兼容,该类型是在名称中指定的类型的擦除(§4.6)演员。如果抛出运行时异常,则为ClassCastException
。如果
R
是普通类(不是数组类):
如果
T
是类类型,那么R
必须是与T
相同的类(§4.3.4)或T
的子类{1}}或抛出运行时异常。...
...
在您的情况下,R
为Beta
,T
为Delta
。请注意,Beta
不是Delta
的子类。
答案 2 :(得分:1)
您将x
转换为Delta
,但x
的类型为Beta
,由Delta
扩展,反之亦然。因此,您的ClassCastException
。
顺便说一下, Gamma 发生了什么?