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可以。
任何解决方案?
答案 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中的操作顺序是
parentesis中包含的任何内容
方法调用
解析对象类型
Postfix(a ++或a - )
乘法/除法
加/减
实例,&lt;,&gt;或其他关系表达式
等于/不等于(==,!=)
和/或(&amp;&amp;,||)
任何作业(=,+ =, - =等等)