繁体   English   中英

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

[英]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

AAA ,所以您可以做到

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM