Java实体组件系统-推理变量T具有不兼容的边界
我试图用java制作一个自定义实体组件系统,但在类型擦除方面遇到了一些困难。整个系统功能正常,只需保存一种方法。我希望能够调用一个泛型方法Java实体组件系统-推理变量T具有不兼容的边界,java,components,entity,system,Java,Components,Entity,System,我试图用java制作一个自定义实体组件系统,但在类型擦除方面遇到了一些困难。整个系统功能正常,只需保存一种方法。我希望能够调用一个泛型方法createEntity(Class),因此,在阅读本文之后,我找到了这个特定问题的解决方案 问题是,当使用通配符时,编译器无法保证对象的类型正确,但通过使用泛型帮助器方法,您可以通过捕获通配符的类型来确保每个元素的类型安全。在本例中,这就是我使用的帮助器方法 private <T extends Component> void addNewCom
createEntity(Class),因此,在阅读本文之后,我找到了这个特定问题的解决方案
问题是,当使用通配符时,编译器无法保证对象的类型正确,但通过使用泛型帮助器方法,您可以通过捕获通配符的类型来确保每个元素的类型安全。在本例中,这就是我使用的帮助器方法
private <T extends Component> void addNewComponentInstance(Class<T> type, int uid){
try {
getParent().getComponentManager().add(type, uid, type.newInstance());
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void addNewComponentInstance(类类型,int-uid){
试一试{
getParent().getComponentManager().add(类型,uid,类型.newInstance());
}捕获(例外情况除外){
例如printStackTrace();
}
}
这就是它是如何被夹在通配符方法中的
public Entity createEntity(Class<? extends Component>... types){
Entity e = new Entity();
for(Class<? extends Component> type: types)
addNewComponentInstance(type, e.UID);
INDEX.add(e.UID, e);
return e;
}
公共实体createEntity(类不确定,但如果您是扩展
一个接口,那么它仍然是一个接口
我的意思是说所有组件都将实现组件
接口。那么您不应该使用实现
而不是扩展
?因此,我在编辑中所做的语义更改^“假设所有组件都将实现组件接口”您使用什么版本的Java进行编译?自Java 8以来,类型推断发生了变化,我无法在Intellij IDEA中使用Java 9重新创建它。
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);
}
}
}
public interface Component{}
private <T extends Component> void addNewComponentInstance(Class<T> type, int uid){
try {
getParent().getComponentManager().add(type, uid, type.newInstance());
} catch (Exception ex) {
ex.printStackTrace();
}
}
public Entity createEntity(Class<? extends Component>... types){
Entity e = new Entity();
for(Class<? extends Component> type: types)
addNewComponentInstance(type, e.UID);
INDEX.add(e.UID, e);
return e;
}