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

Tri*_*Man 3 java generics

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

Map<Class<? extends Model>, List<? extends Model>> mockStore;
Run Code Online (Sandbox Code Playgroud)

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

protected <T extends Model> void insertMockStore(T obj)
{
    mockStore.get(obj.getClass()).add(obj);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

biz*_*lop 6

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

insertMockStore方法类似,但没有任何保证Model传递给的子类insertMockStore与列表相同.

你应该做的是宣布mockStore如下:

Map<Class<? extends Model>, List<Model>> mockStore;
Run Code Online (Sandbox Code Playgroud)

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

*与泛型一样,在"子类"中我们包括类本身.

  • 我知道我错过了一些简单的事情.感谢您的投入! (3认同)