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>() {{....为了编译代码.
为什么会这样?为什么我可以创建一个地图并使用钻石,如果我只创建一个新实例但是如果我通过匿名类创建一个地图,代码就无法编译?
这只是一个猜测,但是当你这样做时
new HashMap<>() {{
put("something", "something");
}};
Run Code Online (Sandbox Code Playgroud)
它实际上创建了一个HashMap我不喜欢这个的子类,因为你用一堆子类弄脏了你的类。我猜测在这种情况下 Java 无法推断通用钻石类型是什么,因为它正在被子类化。