【问题标题】:Java error on casting a superclass obj to a subclass obj将超类 obj 转换为子类 obj 时出现 Java 错误
【发布时间】:2014-03-07 02:29:30
【问题描述】:

我有一个愚蠢的 Java 问题,这是一个场景

Class A {}
Class AA extends A{}

AA aa = new AA()
A a = new A()

当我这样做时

aa = (AA) a; 

我在线程“main”java.lang.ClassCastException 中遇到了一些错误,例如 Exception: A cannot be cast to AA

问题出在哪里?

【问题讨论】:

  • 可能是错字?你的意思是说A a = new AA();
  • a 肯定是 A,但可能或不可能是 AA。我假设您的意思是 A a = new A()
  • AA 是 A 。我相信它应该可以工作,它被称为显式转换。例如,r = (Rose) f; r 是 Rose 对象, f 是 Fl​​ower 对象。玫瑰延伸花,玫瑰(AA)是一朵花(A)。所以我真的不知道出了什么问题......
  • 是的,你得到了正确的错误!
  • 就像你说的“AA 是 A”。但是,您的代码 (AA) a 正在尝试将 A 转换为 AA。如果(A) aa

标签: java classcastexception


【解决方案1】:

这是您的继承层次结构

Object
  |
  A       <--------- your object
  |
  AA

变量a 正在引用A 类型的对象,但您正试图将其转换为AA。这是不可能的,因为 A 不是 AA

AAA,所以你可以这样做

A a = new AA();
AA a = (AA) a;

但你做了相反的事情。

【讨论】:

    【解决方案2】:

    您可以将子类实例转换为超类,但不能将超类实例转换为子类。

    引用对象的变量可以是与该对象相同的类型,也可以是该对象的任何超类型

    SubType sub = new SuperType();

    ...将无法编译,因为“new SuperType()”返回 SuperType 类型的引用,并且编译器知道 SuperType 不是子类型。

    【讨论】:

    • 谢谢,但请参阅我对 Animal, Dog 示例的评论。
    【解决方案3】:
    class Animal { }
    class Dog extends Animal { }
    class DogTest {
      public static void main(String [] args) {
        Animal animal = new Animal();
        Dog d = (Dog) animal; // compiles but fails later
      }
    }
    

    这可能很疯狂!这段代码编译!当我们尝试运行它时,我们会得到一个 例外是这样的: java.lang.ClassCastException

    为什么我们不能相信编译器会在这里帮助我们?看不到那只动物 是动物类型?

    编译器所能做的就是验证这两种类型在 相同的继承树,因此取决于之前可能出现的任何代码 沮丧,动物可能是狗类型。编译器必须允许 可能在运行时起作用的东西。

    但是,如果编译器知道 确定演员不可能工作,编译将失败。

    以下 替换代码块将无法编译

    Animal animal = new Animal();
    Dog d = (Dog) animal;
    String s = (String) animal; // animal can't EVER be a String
    

    在这种情况下,您会收到如下错误: 不可转换的类型

    【讨论】:

    • 感谢所有伟大的 cmets。我的下一个问题是如果 Animal animal = new Animal();无法更改,这意味着我无法将行更改为 Animal animal = new Dog() 。如何将“动物”分配给变量“d”?在我看来, Dog 失去了扩展 Animal 的目的,对吧?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2019-09-30
    • 1970-01-01
    • 2014-07-08
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多