同时使用Java类型转换和调用方法

nic*_*ick 2 java

Java的新手.

我有一个叫做的类GraphicsObject和一个Bug扩展它的类.

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

private ArrayList<GraphicsObject> gc = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

然后我有一个函数可以调用每个名为updateObjects()的帧.

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

类型转换失败并且moveNorth()方法永远不会被识别,因为类GraphicsObject没有那个方法,只有Bug有.

有解决方案吗

ggr*_*ner 7

gc.get(i)在调用方法之前,必须首先转换实际返回值.必须将强制转换放在括号中的原因是java中的类型转换操作符的优先级低于方法调用.

((Bug)gc.get(i)).moveNorth();
Run Code Online (Sandbox Code Playgroud)


cor*_*iKa 7

有几种方法可以解决它:

在这种情况下最合适的是

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

或者,您可以添加一个方法graphicsObject并使Bug覆盖它

   abstract public void defaultAction();
Run Code Online (Sandbox Code Playgroud)

并在Bug中

    @Override
    public void defaultAction() {
        moveNorth();
    }      
Run Code Online (Sandbox Code Playgroud)

然后在你的渲染器中:

    for(GraphicsObject go : gc){
        go.defaultAction();
    }
Run Code Online (Sandbox Code Playgroud)