有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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)都意味着什么


共 (2) 个答案

  1. # 1 楼答案

    B扩展了A,因此可以将B的实例转换为A,但不能反过来。代码将编译,但会在运行时抛出ClassCastException

    试图向后代阶级施压被称为向下施压。在本例中,对“I”的转换将允许该代码进行编译,但会导致抛出ClassCastException

  2. # 2 楼答案

    1. 父引用可用于保存子对象。因此下面所有的都是正确的

      A a = new A();
      B b = new B();
      I i = new A();
      a = new B();
      b = new C();
      
    2. 下面尝试将一个对象强制转换为它不是实例的子类。因此,下面将抛出CCE

      b = (B)(I)a;
      c = (C)(I)a;
      

      您可以选择与System.out.println(a instanceof C);