class A {}
interface Wtf{}
A a = new A();
Wtf wtf = (Wtf)a;
是什么原因,为什么编译得很好?同样在 C# 中:D
那是因为a
也可能是实现接口的 A 的子类的实例。所以编译器的行为是正确的。
当你运行它时你会得到一个 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;
}
}
这种转换是允许的(在编译时),因为可以想象它可以工作。
a
实际上可以引用定义B
为class B extends A implements Wtf
.
当然,在您的情况下,它“只是”一个A
并且演员表将在运行时失败。但是编译器在分析中并没有去检查:它只检查变量的静态类型。