我有一个类,其成员定义为:
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不适用?
您的成员声明表明,值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
.
*与泛型一样,在"子类"中我们包括类本身.
归档时间: |
|
查看次数: |
410 次 |
最近记录: |