通用方法无法正确识别类型

时间:2014-07-11 15:49:07

标签: java generics

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

Map<Class<? extends Model>, List<? extends Model>> mockStore;

在这堂课中,我有一个方法:

protected <T extends Model> void insertMockStore(T obj)
{
    mockStore.get(obj.getClass()).add(obj);
}

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

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

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

2 个答案:

答案 0 :(得分:6)

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

insertMockStore方法的确类似,但没有任何保证传递给Model的{​​{1}}的子类与列表相同。

您应该做的是声明insertMockStore,如下所示:

mockStore

这里容易记住的经验法则是“PECS规则”:生产者扩展,消费者超级。这意味着如果您的成员具有类型参数Map<Class<? extends Model>, List<Model>> mockStore; 的集合,则所有生成器类型方法(插入到您的集合中的方法)将需要Foo和所有使用者类型方法(从集合返回值的方法) )应该有T extends Foo

*与泛型一样,在“子类”中我们包括类本身。

答案 1 :(得分:1)

您的mockStoreList<? extends Model>个值,因此不知道您是否可以添加T

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

private final Map<Class, List> mockStore;

@SuppressWarning("unchecked")
protected void insertMockStore(Model obj) {
    mockStore.get(obj.getClass()).add(obj);
}
相关问题