class A {}
interface Wtf{}
A a = new A();
Wtf wtf = (Wtf)a;
是什么原因,为什么编译得很好?也在C#:D
答案 0 :(得分:6)
那是因为a
也可以是实现接口的A的子类的实例。所以编译器的行为是正确的。
答案 1 :(得分:6)
运行时会出现ClassCastException。
编译时没有出错的原因是A的子类可能实现Wtf
,如下所示:
public class A {
interface Wtf { }
static class B extends A implements Wtf { }
public static void main(String[] args) {
A a = new B();
Wtf wtf = (Wtf) a;
}
}
答案 2 :(得分:4)
允许这种强制转换(在编译时),因为可以可以理解。
a
可以实际引用B
类型的对象,该对象定义为class B extends A implements Wtf
。
当然,在你的情况下,它只是"只是"一个A
,演员表将在运行时失败。但是编译器在分析中并没有到目前为止检查:它只检查变量的静态类型。