Java Typecasting&同时调用方法

时间:2012-08-24 20:52:57

标签: java

Java的新手。

我有一个名为GraphicsObject的班级和一个扩展它的班级Bug

我有一个ArrayList,其中包含所有GraphicsObject:

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 个答案:

答案 0 :(得分:7)

在调用方法之前,必须首先转换gc.get(i)的实际返回值。您必须将强制转换置于括号中的原因是java中的类型转换运算符的方法调用低于order of precedence

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

答案 1 :(得分:7)

有几种方法可以解决这个问题:

在这种情况下最合适的是

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

或者,您可以向graphicsObject添加方法并让Bug覆盖它

   abstract public void defaultAction();

和Bug

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

然后在你的渲染器中:

    for(GraphicsObject go : gc){
        go.defaultAction();
    }

答案 2 :(得分:3)

您可以通过编写

来完成此操作
((Bug)gc.get(i)).moveNorth();

但是,无论何时执行此check then cast模式,您可能无法正确构建程序 我建议你改为在GraphicsObject类中添加一个抽象方法,让我们称之为move(),让Bug和所有其他GraphicObject覆盖它。然后你可以删除if语句,然后写

public void updateObjects(){
    for(int i = 0; i < gc.size(); i++){
        gc.get(i).move();
    }
}

答案 3 :(得分:1)

最简单的解决方案是在向北移动之前,确保将对象强制转换为错误。

((错误)gc.get(i))的moveNorth();

供将来参考:

我认为java中的操作顺序是

  1. parentesis中包含的任何内容

  2. 方法调用

  3. 解析对象类型

  4. Postfix(a ++或a - )

  5. 乘法/除法

  6. 加/减

  7. 实例,&lt;,&gt;或其他关系表达式

  8. 等于/不等于(==,!=)

  9. 和/或(&amp;&amp;,||)

  10. 任何作业(=,+ =, - =等等)