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は、2番目の呼び出しでその2番目のレッドウッドをのツリーとして自動的に使用します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

Redwoodから継承すると思いTreeます。の新しいインスタンスを作成しましたTree-これは単に1つではないため、より具体的なタイプにキャストすることはできません。木は必ずしもレッドウッドではありません。継承は逆の方法で機能します-レッドウッド(Tree)new Redwood()木であるため、完全に有効です-これは継承で覚えておくべき重要なフレーズです。

于 2012-07-11T14:35:02.323 に答える
0

を作成しTree、コンパイラにそれを納得させようとしていRedwoodます。そうではありません!

私は通常、そのようなキャスティングを見ることを期待していません。これを行う必要がある場合は、オブジェクトモデリングが正しくないことを示唆していることがよくあります。

上記の例ではTree、抽象的であり、作成することRedwoodsなどを期待しています。特定の種を作成することが期待されるため、Larchs作成することはできません。メソッドへのインターフェースは、aTree-aであるため、の観点から話す可能性があります。TreesRedwood Tree

于 2012-07-11T14:35:36.740 に答える
0

RedwoodはTreeのサブクラスであり、TreeからRedwoodにキャストしようとしています。ツリーはレッドウッドではないため、これは不可能です。レッドウッドはツリーでもあるので、ツリーにキャストできます。

于 2012-07-11T14:36:07.580 に答える
0

と呼ばれるAサブクラスのインスタンスにオブジェクトクラスをキャストすることはできません。AB

于 2012-07-11T14:36:34.117 に答える