【发布时间】:2018-07-25 17:20:26
【问题描述】:
我正在尝试在 java 中制作自定义实体组件系统,但在类型擦除方面遇到了一些困难。整个系统功能正常保存一种方法。我希望能够调用一个泛型方法createEntity(Class<? extends Component>... types);,它接收一个类型的var args 数组,创建一个新的空白实体,并使用反射添加指定类型的新组件。这是我写的方法。
public Entity createEntity(Class<? extends Component>... types){
Entity e = new Entity();
for(Class<? extends Component> type: types){
try {
getParent().getComponentManager().add(type, e.UID, type.newInstance());
} catch (Exception ex) {
ex.printStackTrace();
}
}
INDEX.add(e.UID, e);
return e;
}
这是导致编译错误的行。
getParent().getComponentManager().add(type, e.UID, type.newInstance());
这是ComponentManager 类中的方法。
public <T extends Component> void add(Class<T> type, int uid, T component){
if(component != null){
ComponentIndex<T> index = getComponentsByType(type);
if(!index.has(uid)){
index.add(uid, component);
component.setParent(this);
}
}
}
Component 类只是一个空接口。
public interface Component{}
我从 NetBeans 工具提示中不断收到的错误类似于
...类 ComponentManager 中添加的方法不能应用于给定类型; 必需:类,int,T 找到:类,int,类 原因:推理变量 T 的边界不兼容...
鉴于所有组件都将实现Component 接口,并且所有组件都将具有不带参数的构造函数,我如何使用反射来创建基于通用Class<?> 的组件?
【问题讨论】:
-
不确定,但如果您是
extending接口,那么它仍然是interface -
我的意思是所有组件都将实现
Component接口。 -
所以你不应该使用
implements而不是extends吗? -
因此我在编辑中所做的语义更改^ “鉴于所有组件都将实现组件接口”
-
你用什么版本的Java编译?自 Java 8 以来,类型推断发生了变化,我无法在 Intellij IDEA 中使用 Java 9 重新创建它。
标签: java components entity system