Java HashMap/TreeSet组合不一致

Java HashMap/TreeSet组合不一致,java,collections,Java,Collections,这很好用: Map aMap; aMap = new HashMap<String, TreeSet<String>>(); Map-aMap; aMap=newhashmap(); 这不会编译: Map<String, Set<String>> aMap; aMap = new HashMap<String, TreeSet<String>>(); Map-aMap; aMap=newhashmap(); 错误消息

这很好用:

Map aMap;
aMap = new HashMap<String, TreeSet<String>>();
Map-aMap;
aMap=newhashmap();
这不会编译:

Map<String, Set<String>> aMap;
aMap = new HashMap<String, TreeSet<String>>();
Map-aMap;
aMap=newhashmap();
错误消息:

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>>
编译失败(26/05/2014 11:45:43)错误:第2行-不兼容类型-
找到java.util.HashMap
但应为java.util.Map

为什么?

第一种方法有效,因为您使用了原始类型(没有泛型),因此可以在其中放置任何类型的贴图

第二个不起作用,因为

因此,您需要在以下两者之间进行选择:

Map<String, Set<String>> aMap = new HashMap<String, Set<String>>();
//or
Map<String, TreeSet<String>> aMap = new HashMap<String, TreeSet<String>>();
改用这个:

    Map<String, ? extends Set<String>> aMap;
    aMap = new HashMap<String, TreeSet<String>>();
Map-aMap;
aMap=newhashmap();
因为集合的泛型不能与TreeSet的泛型相同。

+1根据Peter的回答,TreeSet实现了SortedSet,它扩展了集合

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

将正常工作。

错误消息是什么?因为在第一个示例中,
aMap
是在不使用泛型的情况下定义的,所以它不执行泛型类型验证(但显示警告!)。第二个示例定义了
aMap
的类型,因此可以对类型进行适当的检查(谷歌搜索泛型中的通配符)。这有什么问题吗?基本上,对于第一个代码,编译器会告诉您“我希望您确定您的代码工作正常,因为我不知道”。。。在第二个例子中,编译器确信您的定义是错误的。@Macrosoft Dev问题在于我的理解+1是-我使用的是7+,因此使用菱形符号可能更安全。。。选择一个非特定的符号使事情变得更安全似乎很奇怪。值得注意的是,您将无法在映射中放置任何键值对(映射为null的键除外)。使用更智能的编译器,这可能会起作用,如果您愿意,您可以编写FR。+1这是来自Java站点的吗?你能添加到源的链接吗?
    Map<String, ? extends Set<String>> aMap;
    aMap = new HashMap<String, TreeSet<String>>();
Map<String, ? extends Set<String>> aMap;
    aMap = new HashMap<String, TreeSet<String>>();