为什么可以将对象转换为任何接口?

时间:2013-05-23 12:21:14

标签: java

class A {}
interface Wtf{}


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

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

3 个答案:

答案 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,演员表将在运行时失败。但是编译器在分析中并没有到目前为止检查:它只检查变量的静态类型。