我得到用下面的代码的错误(摘录如下所述):Map.put使用泛型
public class MyClass {
private Map<String, Subclass1> mapToSubclass1;
private Map<String, Subclass2> mapToSubclass2;
public void update(
final boolean updatesAreSubclass1,
final List<? extends Superclass> updates) {
Map<String, Superclass> mapToUpdate;
if (updatesAreSubclass1) {
mapToUpdate = mapToSubclass1;
} else {
mapToUpdate = mapToSubclass2;
}
updates.stream().forEach((entity) -> {
mapToUpdate.put(entity.getId(), entity);
});
}
}
其中Subclass1
和Subclass2
延伸Superclass
,和Superclass
提供public String getId();
。
正如我写的,在尝试定义mapToUpdate - Incompatible types. Required: Map<String, foo.bar.Superclass>, Found: Map<String, foo.bar.Subclass1>
(或子类2,在else子句中)时会出错。
如果我改变mapToUpdate到Map<String, ? extends Superclass>
,我试图put
当得到一个错误 - Wrong 2nd argument type. Found: 'foo.bar.Superclass', required '? extends foo.bar.Superclass'
我认为这是协方差的概念做的,但我不知道如何解决问题。我想到了,没有满意的一对夫妇的解决方案:
- 我应该需要两个
update
方法,每个子类(如果有两个以上这很快就会变得混乱)? - 我是否应该将
put
移至if (updatesAreSubclass1)
条款中,并将updates
转换为相应的List<Subclass>
?
我不知道我是否理解正确,但不是可以将子类映射投影到mapToUpdate吗? mapToUpdate =(HashMap)(Map)mapToSubclass1; –
Juan