我会先发布我的代码:
public static <T> ConcurrentMap<String,Collection<?>> reduceMap(ConcurrentMap<String, ConcurrentHashMap<String, Collection<T>>> map) {
ConcurrentMap<String, Collection<?>> smallerMap = new ConcurrentHashMap<String, Collection<?>>();
for (String material : map.keySet()) {
for(String genre: map.get(material).keySet()) {
if (smallerMap.get(genre) == null) {
smallerMap.put(genre, map.get(material).get(genre));
}
else {
Collection<?> stories = smallerMap.get(genre);
for (Object o : map.get(material).get(genre)) {
if (!smallerMap.get(genre).contains(o)) {
stories.add(o); // error here
}
}
smallerMap.put(genre, stories);
}
}
}
return smallerMap;
}
错误:
The method add(capture#5-of ?) in the type Collection<capture#5-of ?> is not applicable for the arguments (Object)
较大地图内容的示例:
(reading material -> genre -> stories)
books -> fiction -> story1,story3
books -> tale -> story2,story4
novels-> fiction -> story2, story3
novels-> tale - > story3
生成的较小地图应具有:
fiction -> story1,story2,story3
tales -> story2,story3,story4
我正在尝试将较大地图的内容合并为较小的地图。两个地图之间的区别在于较大的地图具有外部索引(阅读材料的类型)。较小的地图包含与较大地图(流派)中的第二个索引相同的信息。我希望能够将较大地图的第二个索引中的内容组合在一起,并将其放入较小的地图中,而不使用第一个外部索引。我想在匹配的流派中添加非重复项。我无法通过错误的路线。我尝试将?
更改为T
。我不知道还有什么可以尝试的。
编辑:
是否可以保留?
的返回类型。
答案 0 :(得分:3)
要使其类型安全,您应该使用以下代码:
public static <T> ConcurrentMap<String,Collection<T>> reduceMap(ConcurrentMap<String, ConcurrentHashMap<String, Collection<T>>> map) {
ConcurrentMap<String, Collection<T>> smallerMap = new ConcurrentHashMap<String, Collection<T>>();
for (String material : map.keySet()) {
for(String genre: map.get(material).keySet()) {
if (smallerMap.get(genre) == null) {
smallerMap.put(genre, map.get(material).get(genre));
}
else {
Collection<T> stories = smallerMap.get(genre);
for (T o : map.get(material).get(genre)) {
if (!smallerMap.get(genre).contains(o)) {
stories.add(o); // error here
}
}
smallerMap.put(genre, stories);
}
}
}
return smallerMap;
}
答案 1 :(得分:0)
是的,这是对的。使用Collection<Object>
代替Collection<?>
。