检查泛型中的引用类型 java

checking type of reference in generics java

我目前正在 java(回合制角色扮演游戏)中制作游戏,但我正面临库存问题 UI。也许我的问题是众所周知的或有一个简单的解决方案,但从未接受过任何培训,我仍然会提出这个问题。

在 selecting 一个项目后显示库存时,我检查该项目是否实现了 SpecificItemWorker 接口,也就是说,作用于必须传入的特定 GameObject到它的 takeAction() 方法。在 selecting 必须传递的对象时,我向用户显示所有可能的候选对象 select。例如,假设用户 select 有一个 UpgradeParchment 作用于任何实现 Upgradable 接口的对象。在这里,我启动了一个 ItemSelector,它显示了实施 Upgradable 的库存中的所有项目。但是 class 不同,对象需要实现的接口才能成为可能的候选者。(请注意,某些对象作用于游戏环境而不是特定对象,但我们没有考虑这种情况在这里。)。现在,我希望它不是在 switch case 语句中对可能的接口进行硬编码,而是 dynamic.I 尝试使用泛型,但它不允许检查对象是否是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 类型,因为在我的清单 class 中,只有 Collectable objects.Similarly 的列表,在我的测试方法中, 我已经更新了 types.Although 这是一个小改动,不便之处敬请谅解。Collectable 也是一个接口。

由于运行时类型擦除,您需要向 class:

提供所谓的 类型令牌
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
        }
    }
}

这需要将一个class对象传递给构造函数,通常通过传递一个class文字,例如MyClass.class

有一种方法可以使用 class.getTypeName() 检查类型。

我假设 SpecificItemWorker 是一个游戏对象,如代码所示。

package Whosebug.question39718130;

public class SpecificItemWorker extends GameObject {
}

package Whosebug.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 Whosebug.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 的理解是正确的。如果这适合您的解决方案,请告诉我。