2016-03-07 191 views
1

This問題是與我相似,但我認爲他們是足夠的不同,我可以創造一個新的)。獲取子類的實例

基本上在我小的3D遊戲我所有的實體是由許多不同的組件,一個用於紋理,一個用於移動等,這些子組件從界面「組件」繼承。到目前爲止,我已經使用過這種方法;

public MovementComponent getMovementComponent() { 
    for (Component c : components) { 
     if (c instanceof MovementComponent) 
      return (MovementComponent) c; 
    } 

    return null; 
} 

獲取某個組件的實例。但是現在我希望將其更改爲更通用的方法,可以從我的組件列表中獲取任何類型的組件。我測試了這樣的事情;

public Component getComponentType(Class component) { 
    for (Component c : components) { 
     if (c.getClass() == component) 
      return c.getClass().cast(c); 
    } 

    return null; 
} 

但是,即使我把結果這總是返回界面的「」「實例」,「」,從來沒有一個子組件的實例,這意味着我仍然有它轉換爲相應的類型。基本上我希望有一種方法可以:

  1. 迭代通過集合。
  2. 找到一個特定的子類。
  3. 返回該子類的實例。

我覺得我在這裏的正確軌道,但我無法得到它的工作。感謝您的迴應和反饋。

回答

4

你需要像

public <T extends Component> T getComponentType(Class<T> component) { 
    ... 
    return (T) c; 
} 

方法聲明告訴它將返回相同類型的參數傳遞的一個組成部分。

這樣稱呼它:

MovingComponent mc = smth.getComponentType(MovingComponent.class); 
+0

工程很棒。但是Eclipse給了我一個警告,說這是一個未經檢查的轉換 - 這是什麼意思,這是我應該處理的事情(如果是這樣,怎麼辦?取消警告?)? – Charanor

+0

警告是由於不安全的類型轉換造成的。請參閱我的答案以獲得更好的解決方案 - 方法標頭相同,但使用「cast」方法完成演員。 – Marwin

+0

@Charanor未檢查轉換警告顯示,因爲編譯器不知道你執行==檢查。但既然你這樣做,鑄造是絕對安全的,你可以忽略它@SupressWarning(「未選中」)方法註釋 – AdamSkywalker

2

你需要使用一個通用的參數,這樣的事情:

public <C extends Component> C getComponentType(Class<C> subclass) { 
    for (Component c : components) { 
     if (subclass.isInstance(c)) 
      return subclass.cast(c); 
    } 
    return null; 
} 

感謝到isInstance,這也發現給定參數的任何進一步的子類。