关于铸造

时间:2012-05-01 05:38:14

标签: java

我正在对类型转换做一个简短的研究,下面是我的代码

interface Foo {}
class Alpha implements Foo {}
class Beta extends Alpha {}

public class Delta extends Beta
{
    public static void main( String[] args )
 {      
        Beta x = new Beta();         
         Alpha a = x;
            // Foo f = (Alpha)x;// --> commented out
         Beta b = (Beta)(Alpha)x;   
         Foo f = (Delta)x; //  --> complie time error   

    }

}

如上一个语句中所示,它会抛出运行时错误java.lang.ClassCas tException,请指教,如果我使用Alpha进行投射,那么它的工作原理非常好。

2 个答案:

答案 0 :(得分:4)

您不能将变量转发为类层次结构中比实际对象更深的类型。这是因为某些属性需要添加到下载变量中,并且不清楚它们的值应该是什么。

然而,在关于强制转换的所有检查中,真正重要的是引用对象的实际类型,而不是当前声明的类型。例如,即使您有Alpha a = x;,这仍然可以向下转换为Beta,因为实际实例指向Beta的对象。

答案 1 :(得分:1)

您无法将Beta转发为Delta

您正在做的事情类似于实例化Animal(Beta)对象,然后将其转换为Animal(Beta)的子类,例如a Dog(Delta)。这是非法的。