在下面的代码中,在将Tree向下转换为Redwood的第7行时,没有错误,但是为什么在将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 { }

最佳答案

在第7行,u刚刚通过了Agruments,在第9行进行了实际分配,这等效于以下代码:
树T1 =(Redwood)new Tree(); //这很好,因为基类可以容纳派生类和基类的对象。但是在第10行中,您将T1分配给R2,而T1实际持有基类的对象,而您正试图强制地(通过强制转换)将其分配给Redwood引用,java不允许这样做,就好像您将调用Redwood类的方法一样(因为它实际上包含基类对象),因此无法从此R2引用中调用(它们不在Tree中)。因此,classcast异常。

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

10-12 06:28