2

Java は初めてです。

と呼ばれるクラスとそれを拡張GraphicsObjectするクラスがあります。Bug

すべての GraphicsObject を保持する ArrayList があります。

private ArrayList<GraphicsObject> gc = new ArrayList();

次に、updateObjects() というフレームごとに呼び出される関数があります。

public void updateObjects(){
        for(int i = 0; i < gc.size(); i++){
            if(gc.get(i).toString().equals("Bug") ){
                (Bug)gc.get(i).moveNorth();
            }
        }
    }

型キャストは失敗し、moveNorth() メソッドはまったく認識されません。これは、GraphicsObject クラスにはそのメソッドがなく、Bug だけにあるためです。

解決策はありますか?

4

4 に答える 4

8

あなたがそれについて行くことができるいくつかの方法があります:

この場合に最も適切なのは

    for(int i = 0; i < gc.size(); i++){
        if( gc.get(i) instanceof Bug ){
            ((Bug)(gc.get(i)).moveNorth();
        }
    }

または、メソッドを追加しgraphicsObjectてバグにオーバーライドさせることもできます

   abstract public void defaultAction();

そしてバグで

    @Override
    public void defaultAction() {
        moveNorth();
    }      

次に、レンダラーで:

    for(GraphicsObject go : gc){
        go.defaultAction();
    }
于 2012-08-24T20:55:18.627 に答える
7

gc.get(i)メソッドを呼び出す前に、実際の戻り値をキャストする必要があります。キャストを括弧で囲む必要があるのは、Java の型キャスト演算子の優先順位がメソッド呼び出しよりも低いためです。

((Bug)gc.get(i)).moveNorth();
于 2012-08-24T20:54:45.007 に答える
3

あなたは書くことによってこれを行うことができます

((Bug)gc.get(i)).moveNorth();

ただし、このcheck then castパターンを実行するときはいつでも、プログラムを正しく構造化していない可能性があります。
代わりに、クラスに抽象メソッドを配置し、それをGraphicsObject呼び出してmove()みましょう。Bug他のすべてのGraphicObjects はこれをオーバーライドすることをお勧めします。if次に、ステートメントを削除して、次のように書くことができます

public void updateObjects(){
    for(int i = 0; i < gc.size(); i++){
        gc.get(i).move();
    }
}
于 2012-08-24T20:55:05.977 に答える
1

最も簡単な解決策は、北に移動する前に、オブジェクトがバグにキャストされていることを確認することです。

((バグ)gc.get(i)).moveNorth();

今後の参考のために:

Javaでの操作の順序は

  1. 括弧で囲まれたもの

  2. メソッド呼び出し

  3. オブジェクトの解析タイプ

  4. 後置 (a++ または a--)

  5. 掛け算・割り算

  6. 足し算・引き算

  7. <、>、またはその他の関係式のインスタンス

  8. 等しい/等しくない (==, !=)

  9. および/または (&&, ||)

  10. 任意の代入 (=、+=、-= など)

于 2012-08-24T21:20:06.667 に答える