使用<>通过匿名类创建Map

6 java diamond-operator java-7

在JDK 1.7中我可以创建一个Collectionlet,例如这样说HashMap:

private HashMap<String, String> map = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

随着钻石<>的结束.

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

private static final HashMap<String, String> MAP = new HashMap<>() {{
    put("something", "something");
}};
Run Code Online (Sandbox Code Playgroud)

关于钻石编译器说:

Cannot use ''<>'' with anonymous inner classes
Run Code Online (Sandbox Code Playgroud)

我必须使用:... new HashMap<String, String>() {{....为了编译代码.

为什么会这样?为什么我可以创建一个地图并使用钻石,如果我只创建一个新实例但是如果我通过匿名类创建一个地图,代码就无法编译?

Ami*_*far 5

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

new HashMap<>() {{
    put("something", "something");
}};
Run Code Online (Sandbox Code Playgroud)

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

  • 但我认为OP提出的问题是*为什么*Java在这种情况下无法推断它? (3认同)