将超类obj转换为子类obj时出现Java错误

时间:2014-03-06 02:54:21

标签: java classcastexception

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

Class A {}
Class AA extends A{}

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

当我做的时候

aa = (AA) a; 

我在线程“main”java.lang.ClassCastException中出现了类似Exception的错误:A无法强制转换为AA

问题出在哪里?

3 个答案:

答案 0 :(得分:2)

这是你的继承层次结构

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

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

AAA,因此您可以完成

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

但你做的恰恰相反。

答案 1 :(得分:0)

  

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

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

  

SubType sub = new SuperType();

     

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

答案 2 :(得分:0)

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

为什么我们不能相信编译器来帮助我们?难道不能看到那种动物 是动物类型?

所有编译器都可以验证这两种类型是否在 相同的继承树,因此取决于之前可能出现的代码 垂头丧气,动物可能是狗类型。编译器必须允许 可能在运行时工作的东西。

但是,如果编译器知道 如果演员阵容无法奏效,编译就会失败。

以下 替换代码块将 NOT compile

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

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