Java 使用<;通过匿名类创建映射&燃气轮机;
在JDK 1.7中,我可以创建一个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
集合
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没错,我错过了这一点。