泛型方法不能正确识别类型



我有一个类,它的成员定义为:

Map<Class<? extends Model>, List<? extends Model>> mockStore;
在这个类中,我有一个方法:
protected <T extends Model> void insertMockStore(T obj)
{
    mockStore.get(obj.getClass()).add(obj);
}

但是这个方法会产生编译错误:

方法add(capture#8-of ?类型List中的extends Model)不适用于参数(T)

我不理解这个错误,因为T被定义为扩展模型,所以为什么它会说T不适用?

您的成员声明说mockStore的值将是包含Model的未指定子类*的列表。

insertMockStore方法做类似的,但没有什么保证Model的子类传递给insertMockStore将是相同的列表。

你应该做的是这样声明mockStore:

Map<Class<? extends Model>, List<Model>> mockStore;
一个容易记住的经验法则是"PECS规则":生产者扩展,消费者超级。这意味着,如果你的成员有一个类型参数为Foo的集合,那么所有生产者类型的方法(插入到你的集合中的方法)都需要T extends Foo,所有消费者类型的方法(从集合返回值的方法)都需要T super Foo

*和一般的泛型一样,在"子类"中我们包含了类本身。

你的mockStoreList<? extends Model>值,所以它不知道你是否可以添加T给它。

更简单的解决方案是简化你的声明。

private final Map<Class, List> mockStore;
@SuppressWarning("unchecked")
protected void insertMockStore(Model obj) {
    mockStore.get(obj.getClass()).add(obj);
}

最新更新