解释这个关于对象引用转换的输出?

K.T*_*ess 7 java casting interface

interface I {
}
class A {
}
class B {
}
public class Test {
    public static void main(String args[]) {
        A a = null;
        B b = (B)a; // error: inconvertible types

        I i = null;
        B b1 = (B)i;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道为什么a不能被施展B,因为B不是从继承A.
我的问题是,为什么B b1 = (B)i;允许,因为B不是实现I
为什么B b1 = (B)i;这一行不会强制运行时异常,因为它i是null?

Jef*_*rey 11

编译器不知道有关类层次结构的所有内容.就其而言,可能存在class B2 extends B implements I上述演员需要工作的情况.

  • @Powerlord这是不可能的.它甚至可以在你编写扩展`B`的类之前编译`Test`.Java 8有很多很酷的新功能,但时间旅行不是其中之一. (3认同)
  • @JeroenVannevel编译器在这里知道`A`和`B`是不相关的,并且由于Java不进行类的多重继承,因此可以100%确定没有`B`的子类也可以是`A的子类`.这不适用于接口,因为同一个类可能同时成为`B`的子类和`I`的实现(除非`B`是`final`). (3认同)