0

在下面的程序中,我希望没有例外。使用go2go() 方法中的方法,我收到异常错误“无法将树转换为 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();
                }  
        }


    }

}
4

6 回答 6

2

红木是一种树。一棵树不是一种红木,就像所有动物都是猫一样。所以这不起作用:

(Redwood)new Tree()

但这会:

(Tree)new Redwood()

也许你打算这样做:

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

}

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

于 2012-07-11T14:37:35.950 回答
1

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

试图将结果new Tree()转换为Redwood必须失败。对于所有 VM 而言,它可能是一棵桦树。

于 2012-07-11T14:36:13.880 回答
0

您不能将对象类强制转换为被调用A的某个子类的实例。AB

于 2012-07-11T14:36:34.117 回答
0

你正在创建一个Tree,然后试图说服编译器它是一个Redwood. 它不是!

我通常不会期望看到这样的选角。如果您必须这样做,通常表明您的对象建模不正确。

在上面的示例中,我希望Tree是抽象的,并且您可以创建RedwoodsLarchs。您将无法创建 a Tree,因为您需要创建特定的物种。Trees因为 a Redwood is-a ,所以方法的接口可能会用Tree.

于 2012-07-11T14:35:36.740 回答
0

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

于 2012-07-11T14:36:07.580 回答
0

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

于 2012-07-11T14:35:02.323 回答