Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用<;通过匿名类创建映射&燃气轮机;_Java_Java 7_Diamond Operator - Fatal编程技术网

Java 使用<;通过匿名类创建映射&燃气轮机;

Java 使用<;通过匿名类创建映射&燃气轮机;,java,java-7,diamond-operator,Java,Java 7,Diamond Operator,在JDK 1.7中,我可以创建一个集合lets,例如说一个HashMap,如下所示: private HashMap<String, String> map = new HashMap<>(); private static final HashMap<String, String> MAP = new HashMap<>() {{ put("something", "something"); }}; private HashMap m

在JDK 1.7中,我可以创建一个
集合
lets,例如说一个
HashMap
,如下所示:

private HashMap<String, String> map = new HashMap<>();
private static final HashMap<String, String> MAP = new HashMap<>() {{
    put("something", "something");
}};
private HashMap map=new HashMap();
最后是菱形

但如果我正在创建这样的地图:

private HashMap<String, String> map = new HashMap<>();
private static final HashMap<String, String> MAP = new HashMap<>() {{
    put("something", "something");
}};
private static final HashMap MAP=new HashMap(){{
放(“某物”、“某物”);
}};
在钻石上,编译器说:

Cannot use ''<>'' with anonymous inner classes
无法将“”与匿名内部类一起使用
我必须使用:
。。。新建HashMap(){{….
,以便编译代码


为什么会这样?如果我只是创建一个新实例,为什么我可以创建一个映射并使用diamond,但是如果我是通过一个匿名类创建映射,那么代码不会编译?

这只是一个猜测,但是当您这样做时

new HashMap<>() {{
    put("something", "something");
}};
newhashmap(){{
放(“某物”、“某物”);
}};

它实际上创建了一个子类
HashMap
我不喜欢这样,因为你用一堆子类弄脏了你的类。我猜在这种情况下,Java无法推断什么是泛型菱形类型,因为它是子类化的。

有趣的发现。我自己也很好奇。我不认为它是重复的-这个问题是问为什么。Th另一个问题的答案并不是说Sun为什么做出这个决定,只是说你做不到。@MrSpoon这实际上是Oracle的决定,不是Sun的决定。:PI认为泛型是在Oracle接管之前添加的。@MrSpoon是的,但类型推断是在Oracle收购Sun之后在java 7中引入的。:)但我认为OP要问的问题是为什么Java在这种情况下不能推断吗?@mattb它实际上创建了一个
HashMap
Yep的子类,但正如上面所说的,这也是因为子类化。这个问题也没有答案来解释为什么。@AmirRaminfar实际上这个问题的公认答案确实提供了一个原因:“然后,子类将被编译,就好像您编写了
…扩展HashMap
,而这显然与
Map
不兼容”@matts没错,我错过了这一点。