【问题标题】:Implicit interface, class casting in JAVA隐式接口,JAVA 中的类转换
【发布时间】:2018-12-04 20:25:59
【问题描述】:

我正在学习 JAVA Programmer I 证书,但其中有一个我无法理解的问题:

//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) 是什么意思?

【问题讨论】:

  • 这样看,所有 B 都是 A,但并非所有 A 都是 B。在这个例子中,只有 B 扩展了 A,但可能有一个新的类 Z 扩展 A,它将是 A,但不会是一个乙

标签: java interface casting


【解决方案1】:

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

尝试转换为后代类称为向下转换。在这种情况下,转换为“I”是允许该代码编译的原因,但会导致抛出 ClassCastException。

【讨论】:

    【解决方案2】:
    1. 父引用可用于保存子对象。因此以下所有内容都是正确的。

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

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

      你可以和System.out.println(a instanceof C);一样查看

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-20
      • 2023-03-10
      • 2016-06-21
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2014-09-27
      相关资源
      最近更新 更多