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

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?extended Model)不适用于参数(T)

我不理解此错误,因为T被定义为扩展模型,那么为什么会说T不适用?

最佳答案

您的成员声明说mockStore的值将是包含Model的未指定子类*的列表。
insertMockStore方法的作用类似,但是不能保证传递给ModelinsertMockStore的子类与列表相同。

相反,您应该这样声明mockStore:

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

一个容易记住的经验法则是“PECS规则”:生产者扩展,消费者超级。这意味着,如果您的成员具有类型参数为Foo的集合,则所有生产者类型方法(插入到集合中的方法)都需要T extends Foo,而所有使用者类型方法(从集合中返回值的方法)都应具有T super Foo

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

07-28 01:09
查看更多