1
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出现在这里?

4

3 回答 3

6

刚刚用简单的英语写了你的代码:

Alpha IS-A Foo

Beta IS-A阿尔法

Delta IS-A测试版

笔记:

Beta不是Delta

在这里换行;

Foo f = (Delta) x; 

希望这可以帮助。如果您有任何问题,请告诉我。

于 2013-07-23T14:35:07.627 回答
2

您收到ClassCastException符合JLS §5.5.3 的

这是检查R对象的运行时类型是否与类型兼容的算法,该类型T是强制转换运算符中命名的类型的擦除(第 4.6 节)。如果抛出运行时异常,则为ClassCastException.

如果R是普通类(不是数组类):

  • 如果T是类类型,则R必须是与 相同的类(第 4.3.4 节T或 的子类T,否则会引发运行时异常。

  • ...

...

在你的情况下,RisBetaTis Delta。请注意,Beta它不是 的子类Delta

于 2013-07-23T14:33:26.267 回答
1

您正在转换xDeltabutx是 type Beta,它由Delta而不是反之亦然扩展。因此,您的ClassCastException.

顺便问一下,伽玛怎么了?

于 2013-07-23T14:34:52.017 回答