我正在研究一些OCAJP JAVA样例题,偶然遇到了以下问题。
请考虑下面的代码。
interface I{ }
class A implements I{ }
class B extends A { }
class C extends B{ }
而以下声明:
A a = new A();
B b = new B();
哪个会编译并且没有错误地运行?
A. a = (B)(I)b;
B. b = (B)(I) a;
C. a = (I) b;
D. I i = (C) a;
问题的答案是A。这很有道理。但我不明白的是,B不是正确的答案。它说错误的原因是“这将在运行时失败,因为a没有指向类B的对象”。
现在,我实际上去Eclipse写下了整个代码。C显然无法编译,D在运行时失败了。至少在我的代码中,B没有任何问题地编译通过。我错过了什么吗?或者这本书实际上是错误的?
我在Eclipse中实际放入的代码如下:
public class Test{
public static void main (String[]args){
A a = new A();
B b = new B();
a=(B)(I)b;
b=(B)(I)a;
}
}
interface I{ }
class A implements I{ }
class B extends A { }
class C extends B{ }