java - 当代码尝试将 Tree 向下转换为 Redwood 时,将抛出 ClassCastException

标签 java typecasting-operator

在下面的代码中,在第 7 行,当我们将 Tree 向下转换为 Redwood 时,没有错误,但为什么在将 Tree 向下转换为 Redwood 时,在第 10 行出现运行时错误

public class Redwood extends Tree {
    public static void main(String[] args) {
        new Redwood().go();
    }
    void go() {
        go2(new Tree(), new Redwood());
        go2((Redwood) new Tree(), new Redwood());// no error here
    }
    void go2(Tree t1, Redwood r1) {
        Redwood r2 = (Redwood)t1;// runtime error here
        Tree t2 = (Tree)r1;
    }
}
class Tree { }

最佳答案

好吧,虽然 Redwood 实例始终是 Tree 实例,但并非所有 Tree 实例都是 Redwood 。当您创建 Tree 实例(使用 new Tree())时,它肯定不是 Redwood 实例,并且不能转换为 红木

Redwood r2 = (Redwood)t1;t1 不是 Redwood 时,会抛出 ClassCastException。在第一次调用 go2 时,第一个参数是 new Tree(),它不是 Redwood

哦,您在这里看到错误的原因 - Redwood r2 = (Redwood)t1; (第 10 行)而不是第 7 行 (go2((Redwood) new Tree( )、new Redwood());) 是第 10 行首先执行,在第一次调用 go2() 时(第 6 行)。如果您对第 6 行进行注释,您将在第 7 行中得到异常。

关于java - 当代码尝试将 Tree 向下转换为 Redwood 时,将抛出 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34379021/

相关文章:

c++ - 如何动态转换模板类

C : Segmentation fault with typecasting

java - logback 未设置 Spring 日志记录阈值

java - HttpPost 转义参数

java - 父类(super class)中的私有(private)final可以被覆盖吗?

c++ - 未调用类型转换运算符

Java WebStart : How to fix deployJava. js 忽略 Chrome 42 并假设安装了 java

java - 在java中读取换行字符

c - 为什么变量变为零?

c++ - 如何将整数存储在字符数组中?