为什么我的代码中出现“ClassCastException”?

时间:2013-07-23 14:30:27

标签: java

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

3 个答案:

答案 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}}或抛出运行时异常。

  •   
  • ...

  •   
     

...

在您的情况下,RBetaTDelta。请注意,Beta不是Delta的子类。

答案 2 :(得分:1)

您将x转换为Delta,但x的类型为Beta,由Delta扩展,反之亦然。因此,您的ClassCastException

顺便说一下, Gamma 发生了什么?