HashMap / TreeSet组合不一致

时间:2014-05-26 10:40:17

标签: java collections

这样可行:

Map aMap;
aMap = new HashMap<String, TreeSet<String>>();

这不编译:

Map<String, Set<String>> aMap;
aMap = new HashMap<String, TreeSet<String>>();

错误讯息:

Compilation failed (26/05/2014 11:45:43) Error: line 2 - incompatible types - 
  found java.util.HashMap<java.lang.String,java.util.TreeSet<java.lang.String>>
  but expected java.util.Map<java.lang.String,java.util.Set<java.lang.String>>

为什么?

3 个答案:

答案 0 :(得分:10)

第一个可行,因为您使用原始类型(没有通用),因此您可以在其中放置任何类型的地图。

第二个不起作用,因为a XXX<Set> is not a XXX<TreeSet>

所以你需要在:

之间做出选择
Map<String, Set<String>> aMap = new HashMap<String, Set<String>>();
//or
Map<String, TreeSet<String>> aMap = new HashMap<String, TreeSet<String>>();

在这两种情况下,你都可以写:

aMap.put("abc", new TreeSet<>());

主要区别在于,当您从地图获取项目时,使用前一种结构,您将无法访问TreeSet特定方法。

最后,使用Java 7+,您可以省略右侧的通用信息,编译器将自动为您确定:

Map<String, Set<String>> aMap = new HashMap<>();
Map<String, TreeSet<String>> aMap = new HashMap<>();

答案 1 :(得分:3)

请改用:

    Map<String, ? extends Set<String>> aMap;
    aMap = new HashMap<String, TreeSet<String>>();

因为Set的泛型不能与TreeSet的泛型相同。

答案 2 :(得分:3)

enter image description here

彼得的答案是

+1,TreeSet实现了扩展Set的SortedSet。

Map<String, ? extends Set<String>> aMap;
    aMap = new HashMap<String, TreeSet<String>>();

会正常工作。