2012-08-24 61 views
2

对Java很新颖。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没有这种方法,只臭虫一样。

任何解决方案?

+0

PS'新的ArrayList <>()','不新ArrayList' – oldrinb

+3

顺便说一句,要检查如果'gc.get(i)'是'Bug',而不是'toString'是否等于''Bug'''。尝试'gc.get(i)instanceof Bug'。 – oldrinb

+0

我创建了一个toString()函数,返回“Bug”,这就是我验证的方式。我不确定以前如何检查课程。现在我知道了 – nick

回答

7

有,你可以去了解它的一些方法:

在这种情况下,最合适的是

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(); 
    } 
+0

谢谢,帮助 – nick

7

您必须先调用实际返回值gc.get(i),然后再调用其方法。您必须将演员放在括号中的原因是java中的类型转换运算符比方法调用的order of precedence更低。

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

您可以通过编写

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

然而,只要你做到这一点check then cast模式,你可能没有正确构建你的程序做到这一点。
我会建议您改为在您的GraphicsObject类中放置抽象方法,我们称其为move()并让Bug和所有其他GraphicObject s覆盖此。然后,你可以消除if语句,只写

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

多数民众赞成有用的感谢 – nick

1

最简单的方法是简单地确保该对象被转换为一个bug之前,向北移动。

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

以供将来参考:

我认为Java操作的顺序是

  1. 任何封闭在parentesis

  2. 方法调用

  3. 解析类型的对象

  4. 后缀(一个++或A--)

  5. 乘法/除法

  6. 加/减的

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

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

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

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

+0

http://bmanolov.free.fr/javaoperators.php是一个很好的参考运营商的优先顺序。 –