2016-09-27 59 views
0

我目前正在用java構建遊戲(基於回合的RPG),並面臨庫存UI中的問題。也許我的問題是衆所周知的,或者有一個簡單的解決方案,但從來沒有接受任何培訓,我仍然會問這個問題。檢查泛型中的引用類型java

在選擇項目後顯示庫存時,我檢查該項目是否實現了SpecificItemWorker界面,即對必須傳入其takeAction()方法的特定GameObject執行操作。當選擇必須傳遞的對象時,我顯示所有可能的候選對象供用戶選擇。例如,假設用戶選擇一個作用於實現Upgradable接口的任何對象的UpgradeParchment。在此,我啓動一個ItemSelector,顯示清單中實施Upgradable的所有項目。然而,對於不同的類,爲了成爲可能的候選對象而需要實現的接口是不同的(請注意,某些對象作用於遊戲環境而不是特定對象,但我們在這裏沒有考慮這種情況。 )。現在,我不想在switch case語句中對可能的接口進行硬編碼,而是希望它是動態的。我嘗試使用泛型,但它不允許檢查對象是否爲Type參數的instanceof。 下面的代碼給出了一個編譯錯誤:

package ui; 

import objects.Collectable; 

public class ItemSelector<T> { 
    public void test(Collectable ob) { 
     if (ob instanceof T) {// compile error 
      // do work 
     } 
    } 
} 

有誰知道如何可以做到這一點感謝您的幫助。

尋找快速回復, 謝謝。

編輯:testAction()方法的參數將Collectable型作爲我的庫存類中,只有一個Collectable objects.Similarly的名單,在我的測試方法,我已經更新了它types.Although是一個小小的變化,抱歉給您造成不便。 Collectable也是一個接口。

回答

1

由於運行時類型擦除,您需要提供什麼叫做型令牌到類:,通常是由路過類文本

public class ItemSelector<T> { 
    private final Class<T> clazz; 
    public ItemSelector(Class<T> clazz) { 
     this.clazz = clazz; 
    } 

    public void test(GameObject ob) { 
     if (clazz.isInstance(ob)) {// use token to check type 
      // do work 
     } 
    } 
} 

這需要一個類的對象傳遞給構造,例如MyClass.class

0

有一種方法可以用class.getTypeName()來檢查類型。

我假設SpecificItemWorker是一個遊戲對象,如代碼所示。

package stackoverflow.question39718130; 

public class SpecificItemWorker extends GameObject { 
} 

package stackoverflow.question39718130; 

public class ItemSelector<T> { 

    private T t; 

    public ItemSelector(final T t) { 
     this.t = t; 
    } 

    public T getT() { 
     return t; 
    } 

    public void test(final GameObject ob) { 
     /*if (ob instanceof T) {// compile error 
      // do work 
     }*/ 

     if (t.getClass().getTypeName() == ob.getClass().getTypeName()) { 
      System.out.println("Grab item."); 
     } else { 
      System.err.println("No item found."); 
     } 
    } 
} 

有一個測試例子傳遞GameObject

package stackoverflow.question39718130; 

public class GameObjectTest { 

    public static void main(final String[] args) { 
     specificItemWorkerTest(); 
    } 

    public static void specificItemWorkerTest() { 
     final GameObject specificItemWorker = new SpecificItemWorker(); 

     final ItemSelector<GameObject> selector = new ItemSelector<>(specificItemWorker); 
     selector.test(specificItemWorker); 
    } 
} 

我希望我能理解你對SpecificItemWorker。請讓我知道這是否適合您的解決方案。

+1

'class.getTypeName()'方法返回關於類類型的信息,但不能用於傳遞IS-A關係test.Also,'SpecificItemWorker'是一個接口。它用於決定用戶選擇使用的對象是否需要另一個「可收集」對象來處理。 –

+0

這在多個級別上不正確,但特別是使用'=='來比較字符串,這永遠不會是真的 – Bohemian