[英]Java error on casting a superclass obj to a subclass obj
我有一个愚蠢的Java问题,这是一个场景
Class A {}
Class AA extends A{}
AA aa = new AA()
A a = new A()
当我做
aa = (AA) a;
我在线程“ main” java.lang.ClassCastException中遇到诸如Exception之类的错误:无法转换为AA
问题出在哪儿?
这是您的继承层次结构
Object
|
A <--------- your object
|
AA
变量a
引用类型A
的对象,但是您试图将其强制转换为AA
。 这是不可能的,因为A
不是AA
。
AA
是A
,所以您可以做到
A a = new AA();
AA a = (AA) a;
但是您却做了相反的事情。
您可以将子类实例转换为超类,但不能将超类实例转换为子类。
引用对象的变量可以与该对象具有相同的类型,也可以是该对象的任何超类型
SubType sub = new SuperType();
...将无法编译,因为“ new SuperType()”返回类型SuperType的引用,并且编译器知道SuperType不是子类型。
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
为什么我们不能信任编译器来帮助我们呢? 它看不到动物是动物类型的吗?
编译器所能做的就是验证这两种类型是否在同一个继承树中,以便根据垂降之前可能出现的任何代码,动物可能是Dog类型的。 编译器必须允许在运行时可能起作用的内容。
但是,如果编译器确定地知道强制转换可能无法进行,则编译将失败。
以下替换代码块将无法编译 :
Animal animal = new Animal();
Dog d = (Dog) animal;
String s = (String) animal; // animal can't EVER be a String
在这种情况下,您会得到如下错误: 不可转换类型
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.