0

我正在尝试创建一个方法,该方法接收扩展 Component 的对象并将其插入到使用对象类作为对象本身的键的映射中。出于某种原因,它抱怨看跌期权

components = new Array<ObjectMap<Class,? extends Component>>();

public <T extends Component> void putComponentOnEntity(Entity e, T component) {
    if (entities.items[e.id] == null) {
        throw new IllegalArgumentException("Entity does not exist anymore");
    }
    ObjectMap<Class, ? extends Component> entityComponents = components.get(e.id);
    entityComponents.put(component.getClass(), component);
}

--

The method put(Class, capture#4-of ? extends Component) in the type ObjectMap<Class,capture#4-of ? extends Component> is not applicable for the arguments (Class<capture#5-of ? extends Component>, T)
4

1 回答 1

2

您不能在 a 中放置任何内容(null 除外)ObjectMap<Class, ? extends Component>,因为它是扩展 Component的某种未知类型ObjectMap<Class, ? extends Component>的映射。所以它可能是一个或一个,但我们不知道。ClassObjectMap<Class, Label>ObjectMap<Class, Button>

向这样的地图添加任何值将有很大的机会添加不具有地图值的实际类型的内容(例如,标签,当地图是按钮地图时),因此编译器禁止它。

编译器必须知道隐藏在后面的实际类型,?以检查您添加到映射中的内容是否与其类型兼容。这就是使泛型类型安全的原因。

于 2013-11-11T22:26:42.067 回答