Java实体组件系统-推理变量T具有不兼容的边界

Java实体组件系统-推理变量T具有不兼容的边界,java,components,entity,system,Java,Components,Entity,System,我试图用java制作一个自定义实体组件系统,但在类型擦除方面遇到了一些困难。整个系统功能正常,只需保存一种方法。我希望能够调用一个泛型方法createEntity(Class),因此,在阅读本文之后,我找到了这个特定问题的解决方案 问题是,当使用通配符时,编译器无法保证对象的类型正确,但通过使用泛型帮助器方法,您可以通过捕获通配符的类型来确保每个元素的类型安全。在本例中,这就是我使用的帮助器方法 private <T extends Component> void addNewCom

我试图用java制作一个自定义实体组件系统,但在类型擦除方面遇到了一些困难。整个系统功能正常,只需保存一种方法。我希望能够调用一个泛型方法
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;
}