2012-08-24 63 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是一個很好的參考運營商的優先順序。 –