Java 为什么不';我们不能在这里得到转换的编译时错误吗?

Java 为什么不';我们不能在这里得到转换的编译时错误吗?,java,casting,Java,Casting,在下面的示例中,为什么编译器不报告将x转换为D的错误 接口X{} 类C实现X{} 类D{} 公共类问题{ 公共静态void main(字符串[]args){ X=新的C(); //为什么这里没有错误? D=(D)x; } } 但是,如果我们将X设为一个类,编译器将报告一个错误: 类X{} 类C扩展X{} 类D{} 公共类问题{ 公共静态void main(字符串[]args){ X=新的C(); //这会导致编译时错误 D=(D)x; } } 允许从X强制转换为D,因为对象可能同时是X和D的实

在下面的示例中,为什么编译器不报告将
x
转换为
D
的错误

接口X{}
类C实现X{}
类D{}
公共类问题{
公共静态void main(字符串[]args){
X=新的C();
//为什么这里没有错误?
D=(D)x;
}
}
但是,如果我们将
X
设为一个类,编译器将报告一个错误:

类X{}
类C扩展X{}
类D{}
公共类问题{
公共静态void main(字符串[]args){
X=新的C();
//这会导致编译时错误
D=(D)x;
}
}

允许从
X
强制转换为
D
,因为对象可能同时是
X
D
的实例。例如:

类E扩展D实现X{}
X=新的E();
D=(D)x;//这里没问题,因为X也可以是D

在您的示例中,我们可以从语句序列中确定,CAST会失败,但java不能,因为在编译时确定类型时,它不考虑控制流。


但是,如果
X
是一个类,那么由于
X
D
没有公共子类(Java不允许类的多重继承),因此对象不可能是两个不相关类的实例。在这种情况下,不允许强制转换,因为基于编译时类型,强制转换永远不会成功(除非
x
null
)。

对于null以外的任何值,在运行时都会得到ClassCastException。@ElliottFrisch这是不正确的。您有编译器时间强制转换错误以及在运行时之前不会发生的错误。有关详细说明,请参见下面的答案hanks@kaya3。