为什么我在我的简单java程序中得到ClassCastException?

时间:2012-07-11 14:32:21

标签: java exception

在下面的程序中我期待没有例外。使用go()方法中的go2方法,我收到异常错误“Tree无法转换为Redwood”。

对我而言,这只是向下倾斜,应该是完全可以的。有人能帮我理解为什么会抛出异常吗?

class Tree{ }  
class Redwood extends Tree {
    void go() 
    {
        go2(new Tree(), new Redwood());
        go2( (Redwood)new Tree(), new Redwood());    
    }

    void go2(Tree t1, Redwood r1)
    {
        Redwood r2 = (Redwood) t1;
        Tree t2 = (Tree) r1;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Redwood().go();
    }
}


>> a similar program and this one works fine .

class Animal2 {  
    static void doStuff(){
        System.out.println("a " );
    }

}  

class Dog extends Animal2{

     static void doStuff(){

         System.out.println("b ");
     }  
     void playdead(){ System.out.print(" ccc" + "\n");
}


    public static void main(String[] args)   {
        // TODO Auto-generated method stub

        Animal2[] a= {new Animal2(), new Dog(), new Animal2()};

        for(Animal2 animal : a)  
        {   
                animal.doStuff();  
            if(animal instanceof Dog)  
        {
                ((Dog) animal).playdead();
                }  
        }


    }

}

6 个答案:

答案 0 :(得分:2)

红木是一种树。树不是一种红木,不仅仅是所有的动物都是猫。所以这不起作用:

(Redwood)new Tree()

但这会:

(Tree)new Redwood()

也许你打算这样做:

void go() {
    go2(new Tree(), new Redwood());
    go2(new Redwood(), new Redwood());

}

Java将在第二次调用中自动使用第二个红木作为go2的树。

答案 1 :(得分:1)

我假设你的程序在go2( (Redwood)new Tree(), new Redwood());失败了。考虑一下:根据您的继承关系,每个Redwood(实例)也是Tree的实例。但不是每棵树都是红木。

尝试将new Tree()的结果转换为Redwood必定会失败。对于所有虚拟机而言,它可能是一个桦树。

答案 2 :(得分:0)

我认为Redwood继承自Tree。您已经创建了Tree的新实例 - 这不能转换为更具体的类型,因为它不是一个。一棵树不一定是红木。继承以另一种方式起作用 - (Tree)new Redwood()完全有效,因为红木树 - 这是继承中要记住的关键短语。

答案 3 :(得分:0)

您正在创建Tree,然后尝试说服编译器它是Redwood。它不是!

我通常不希望看到这样的演员。如果必须这样做,通常会建议您的对象建模不正确。

在上面的示例中,我希望Tree是抽象的,并且您可以创建RedwoodsLarchs等。您将无法创建{{1}因为你需要创造特定的物种。方法的界面可能会以Tree的形式进行讨论,因为Trees 是-a Redwood

答案 4 :(得分:0)

Redwood是Tree的一个子类,你试图从Tree转换为Redwood。这是不可能的,因为树不是红木。您可以将Redwood投射到树上,因为它也是一棵树。

答案 5 :(得分:0)

您无法将对象类A强制转换为A的某个子类B的实例。