检查泛型中的引用类型 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
的理解是正确的。如果这适合您的解决方案,请告诉我。
我目前正在 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
的理解是正确的。如果这适合您的解决方案,请告诉我。