你指出,这将编译:
interface MyInterface {}
class A {}
public class InterfaceCasting {
public static void main(String[] args) {
MyInterface myObject = new MyInterface() {};
A a = (A) myObject;
}
}
但是,不会编译:
interface MyInterface {}
class A {}
public class InterfaceCasting {
public static void main(String[] args) {
A a = (A) new MyInterface() {}; // javac says: "inconvertible types!"
}
}
那么这里发生了什么呢?有什么不同?
那么,因为MyInterface只是一个接口,它可以非常好地被一个扩展A的类来实现,在这种情况下,从MyInterface到A的转换是合法的.
例如,该代码将在所有执行的50%中成功,并说明编译器需要解决可能不可判定的问题,以便在编译时始终“检测”非法的转换.
interface MyInterface {}
class A {}
class B extends A implements MyInterface {}
public class InterfaceCasting {
public static void main(String[] args) {
MyInterface myObject = new MyInterface() {};
if (java.lang.Math.random() > 0.5)
myObject = new B();
A a = (A) myObject;
}
}