JAVA中的隐式接口、类转换
我正在为一名JAVA程序员学习我的证书,其中有一个问题我不明白:
//Given:
interface I{}
class A implements I{}
class B extends A {}
class C extends B{}
//and
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班的孩子,那么A可以等于B而不用施法,为什么B)的答案是错的?甚至连铸造(B)(I)都意味着什么
# 1 楼答案
B扩展了A,因此可以将B的实例转换为A,但不能反过来。代码将编译,但会在运行时抛出ClassCastException
试图向后代阶级施压被称为向下施压。在本例中,对“I”的转换将允许该代码进行编译,但会导致抛出ClassCastException
# 2 楼答案
父引用可用于保存子对象。因此下面所有的都是正确的
下面尝试将一个对象强制转换为它不是实例的子类。因此,下面将抛出CCE
您可以选择与
System.out.println(a instanceof C);