2012-05-23 63 views
14

我有易損的接口爲第三類遵循爪哇 - 接口類型路過的ArrayList

public interface Damageable { 
    public void handleCollision(float impulse); 
} 

實現該接口的類,BaseObject

public class BaseObject implements Damageable 

現在,我有一個ArrayList類型BaseObject

public class ObjectManager {  
    public ArrayList<BaseObject> bodies; 

我想要做的是將ArrayList主體傳遞給anoth方法它接受的ArrayList

public CollisionManager(ArrayList<Damageable> _bodies) { 
     bodies = _bodies; 
} 

的Java類呃沒有讓我做新CollisionManager(機構),其中機構的類型是ArrayList和BaseObject實現易損

我已經試過鑄造。說不能從 ArrayList<BaseObject>強制ArrayList 也嘗試使用Class<? extends Damageable>,但後來我無法調用接口Damageable聲明的方法。我怎樣才能傳遞ArrayList?

+0

看看這個帖子:http://stackoverflow.com/questions/6965035/why-cant-a-method-take-a-collectionsubclass-when-the-methods-signature-is-de – SirPentor

回答

32

你必須明確你的仿製藥。因此,你必須通知你的泛型類型不是編譯器Damagable本身,而是可以擴展Damagable

public CollisionManager(ArrayList<? extends Damagable> bodies) { 

順便說一句,請注意,我將您的變量更改爲bodies而不是_bodies。下劃線不是標準Java編碼約定的一部分。


編輯響應OP的評論

假設,而不是一個接口,有一個名爲Damagable具體類。告訴編譯器<? extends Damagable>說它不一定是Damagable的實例。這是好吧那種類型延伸Damagable。否則,編譯器假定您有一個Damagable剛好是

當你將Damagable想象成一個接口時,它沒有多少意義,因爲沒有這種情況下你會有一個Damagable的實例。但他們的工作方式基本相同。

您必須記住您正在使用Java 類型,而不是類。 Java的類型語法和結構不如它的類結構強壯。當涉及到類型時,沒有implements的概念。


最後一輪的編輯

最後,我要指出,這通常是更好的使用方法/構造函數的參數和方法返回類型的接口。這允許你和那些使用你的方法的人使用你喜歡的任何實現,並且允許你隨意改變你的實現。

因此,與這些修訂,你會:

public CollisionManager(List<? extends Damagable> bodies) { 
+0

感謝您的回覆,但ArrayList必須實現受損,因爲我使用的是該接口的方法。 – wirate

+1

'?擴展了Damagable' *意味着*'在Java通用語言中實現了Damagable'。 –

+0

讓我確認一下。的ArrayList <?擴展Damageable>表示擴展或實現接口的任何類型的ArrayList可損害的權利? – wirate

2

嘗試ArrayList<? extends Damageable > _bodies

這是說,你想一個ArrayList由Class擴展(以及農具)Damageable

+0

什麼是ArrayList <>和ArrayList <?擴展受損>? – wirate

+0

我可能在這裏錯了,但我什麼都沒想。你放的那個指定它必須是一個Class,並且擴展/實現Damageable,但無論如何它必須是一個類(我認爲)。雖然這接近我的泛型知識的極限。你的人編譯? –

+0

ArrayList <>是不可行的,因爲這樣做不會讓我調用已經在界面中聲明的方法。 – wirate

2

其他人將毫無疑問指出,從Java語法角度的技術解決方案。

我只是要提到的幾個設計問題,你或許應該考慮:

  • 你BaseObject實現易損。這意味着所有BaseObjects都是受損的。那麼爲什麼不做一個CollisionManager(ArrayList<BaseObject>)?除非你打算在其他地方使用Damageable(即有些東西是受損的但不是BaseObjects的),那麼它就好像是一個不必要的抽象。
  • 通常用於遊戲/模擬中的碰撞檢測,您希望使用空間數據結構進行碰撞檢測(例如八叉樹,四叉樹或AABB樹)而不是ArrayList。在ArrayList中搜索衝突是O(n^2)算法。如果你有很多活的物體,這將成爲一個大問題。
  • 損壞似乎是一個壞名字,因爲功能與碰撞檢測相關而不是損壞 - 不會更好嗎?
+0

+1主題也許,但絕對有幫助! –

+0

事實上,我在第1點做了你的建議。我只是謹慎小心。 點2:Box2D正在檢測碰撞,我只需在檢測到碰撞時調用此類型的方法 點3:在我的情況中存在碰撞但不會損壞的物體 – wirate