我有一个愚蠢的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
问题出在哪里?
答案 0 :(得分:2)
这是你的继承层次结构
Object
|
A <--------- your object
|
AA
变量a
正在引用A
类型的对象,但您尝试将其强制转换为AA
。这是不可能的,因为A
不是AA
。
AA
是A
,因此您可以完成
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
在这种情况下,您会收到如下错误: 不可转换的类型