如何添加到通配符Collection <! - ? - >?

时间:2013-06-24 19:19:45

标签: java generics map

我会先发布我的代码:

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。我不知道还有什么可以尝试的。

编辑:

是否可以保留?的返回类型。

2 个答案:

答案 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<?>