2016-09-27 58 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