我正在对类型转换做一个简短的研究,下面是我的代码
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进行投射,那么它的工作原理非常好。
答案 0 :(得分:4)
您不能将变量转发为类层次结构中比实际对象更深的类型。这是因为某些属性需要添加到下载变量中,并且不清楚它们的值应该是什么。
然而,在关于强制转换的所有检查中,真正重要的是引用对象的实际类型,而不是当前声明的类型。例如,即使您有Alpha a = x;
,这仍然可以向下转换为Beta
,因为实际实例指向Beta
的对象。
答案 1 :(得分:1)
您无法将Beta
转发为Delta
。
您正在做的事情类似于实例化Animal
(Beta)对象,然后将其转换为Animal
(Beta)的子类,例如a Dog
(Delta)。这是非法的。