-1
class A {}
interface Wtf{}


A a = new A();
Wtf wtf = (Wtf)a;

是什么原因,为什么编译得很好?同样在 C# 中:D

4

3 回答 3

6

那是因为a也可能是实现接口的 A 的子类的实例。所以编译器的行为是正确的。

于 2013-05-23T12:24:32.960 回答
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;
    }
}
于 2013-05-23T12:26:50.020 回答
4

这种转换是允许的(在编译时),因为可以想象它可以工作。

a 实际上可以引用定义Bclass B extends A implements Wtf.

当然,在您的情况下,它“只是”一个A并且演员表将在运行时失败。但是编译器在分析中并没有去检查:它只检查变量的静态类型。

于 2013-05-23T12:25:05.170 回答