【问题标题】:Why this throws compile time error? Rules for class type cast in Java?为什么这会引发编译时错误? Java中类类型转换的规则?
【发布时间】:2014-09-08 12:41:57
【问题描述】:
class A {

}

class B extends A {

   public static void main(String args[]) {
      B b = new A();
   }

}

为什么这会引发编译时错误?为了抑制编译时错误,我们可以执行B b=(B)new A();,但也可以通过ClassCastException

【问题讨论】:

  • 因为A的实例不是B
  • “通过编译时错误”还是“抛出编译时错误”?
  • b 是 B 的实例,而不是 A。它仅在您使用父类型变量并为其分配派生类型时才有效: A a = new B();这就是继承的工作原理。

标签: java


【解决方案1】:

B 是 A,但 A 不是 B。

您只能将对象分配给它自己的实例或其超类,而不是子类。

【讨论】:

    【解决方案2】:

    B b=new A() -> 因为你不能用子类型引用来引用超类型实例。

    B b=(B)new A() -> 是的,您可以将其向下转换为 B,因为 A 和 B 在继承层次结构中。但是在运行时,由于 A 是一种超类型,因此您不能将其强制转换为 B。

    在 B b=(B)new A() 的情况下,编译会成功,因为对于向下转换,编译器会检查类型是否相关(即继承),但在运行时,您试图引用超类型对象( A) 的对象具有子类型引用 (B),因此您最终会遇到异常。

    【讨论】:

      【解决方案3】:

      您不能将父类实例化为继承的类,因为并非所有继承的成员都有机会被初始化。

      但是,您可以做相反的事情:A a = new B();因为 A 是父亲是 B 的泛化,它的所有成员都有机会被初始化。

      【讨论】:

        【解决方案4】:

        根据Dynamic method dispatch,您的超类的对象引用可以指向其子类的对象,但反之亦然无效(即子类对象引用不能指向超类对象)。 在您的代码中,A 是超类,因此可以指向自身和 B 的对象,因为 B 正在扩展 A强>。 但是,在做B b=(B)new A(); 时,你正在表现出一种低调。最好的解释在这里:Class casting in java

        如果您将以上所有内容视为类,并且 circlesquaretriangle 是扩展类 shape 比 shape 的对象引用可以指向 circlesquaretriangle 的对象是有道理的,但是这三个类永远不能指向 shape 类的对象

        【讨论】:

          猜你喜欢
          • 2021-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多