我收到以下代码错误(如代码段所述):
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>
(或else类中的Subclass 2)时出现错误。如果将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>
吗? 最佳答案
这是一个解决方案,它将与无限数量的可能的子类一起使用,因为据我所知,您只是在创建类加Id->超类的映射。
private Map<Class,Map<String,Superclass>> map = new HashMap<>();
void update(List<? extends Superclass> l) {
l.stream().forEach(o -> put(o));
}
public void put(Superclass obj) {
String id = obj.getId();
Map<String,Superclass> submap = map.get(obj.getClass());
if(null == submap) {
submap = new HashMap<>();
map.put(obj.getClass(), submap);
}
submap.put(id, obj);
}
public Superclass get(Class clss, String id) {
return Optional.ofNullable(map)
.map(m -> m.get(clss))
.map(m2 -> m2.get(id))
.orElse(null);
}
关于java - 使用泛型的Map.put,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33595461/