我正在尝试执行以下代码:
Map<Node, TreeSet<String>> childrenNodes = new TreeMap<>(getAll());我将getAllNodesAndEdges方法头放在下面:
public Map<Node, Set<String>> getAll() {...}我需要将一个通用地图及其内部的集合转换为TreeMap和TreeSet,以便进行排序打印。但是,第一段代码有一个编译错误,即"Cannot infer type arguments for TreeMap<>"。
解决这个问题的最好方法是什么?
编辑:下面的更多信息
在Information.java中
public Map<Node, Set<String>> getAll() {
return this.all;
}但是,test1.java需要使用代码
Map<Node, HashSet<String>> all = getAll()test2.java需要使用代码
Map<Node, TreeSet<String>> childrenNodes = new TreeMap<Node, TreeSet<String>>(getAll());但这两种运行类型不匹配编译错误。
第一项:
Type mismatch: cannot convert from Map<Node,Set<String>> to Map<Node,HashSet<String>>第二部分:
The construtor TreeMap<Node,TreeSet<String>>(Map<Node,Set<String>>) is undefined发布于 2017-02-12 20:33:29
您必须为新映射的值创建新对象。
Map<Node, TreeSet<String>> converted = new TreeMap<>();
for(Entry<Node, Set<String>> entry : childrenNodes.entrySet()){
converted.put(entry.getKey(), new TreeSet<>(entry.getValue()));
}发布于 2017-02-12 20:24:48
你不能这样做。
你可以这样做:
1)改变变量childrenNodes的类型
Map<Node, Set<String>> childrenNodes = new TreeMap<>(getAll());即不是Map<Node, TreeSet<String>>,而是Map<Node, Set<String>>
任一
2)使getAll()返回类型
Map<Node, TreeSet<String>> getAll()编译器的错误确切地告诉您:从TreeSet<String>中推断Set<String>是不可能的。粗略地说,就像尝试这样的任务一样:HashMap<String> foo = getMap();,getMap()返回的只是Map<String>。
发布于 2017-02-13 11:02:07
您不能只将一种类型的集合(TreeSet,HashSet)转换到另一种类型。您需要通过方法参数传递供应商,例如TreeSet::new。
private final Map<Node, Set<String>> all;
public <S extends Set<String>, M extends Map<Node, S>> M getAll(Supplier<M> mapFactory, Supplier<S> setFactory) {
return all.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().stream().collect(Collectors.toCollection(setFactory)),
(v1, v2) -> v1,
mapFactory));
}然后你会这样称呼它:
Map<Node, HashSet<String>> test1 = getAll(HashMap::new, HashSet::new);
Map<Node, TreeSet<String>> test2 = getAll(TreeMap::new, TreeSet::new);或者更好的方法是,对您的局部变量类型使用排序的接口而不是实现类:
Map<Node, Set<String>> test1 = getAll(HashMap::new, HashSet::new);
SortedMap<Node, SortedSet<String>> test2 = getAll(TreeMap::new, TreeSet::new);https://stackoverflow.com/questions/42192592
复制相似问题