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并让 Bug 覆盖它

   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

最简单的解决方案是在向北移动之前简单地确保对象被投射到错误中。

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

备查:

我认为java中的操作顺序是

  1. 任何包含在 parentesis 中的东西

  2. 方法调用

  3. 解析对象的类型

  4. 后缀(a++ 或 a--)

  5. 乘法/除法

  6. 加/减

  7. <、> 或其他关系表达式的实例

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

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

  10. 任何赋值(=、+=、-= 等)

于 2012-08-24T21:20:06.667 回答