为什么我不能将Java 7菱形语法与guava ImmutableSortedMap.Builder一起使用

nik*_*hil 2 java diamond-operator guava java-7

我正在使用java 7,这个代码片段无法编译

ImmutableSortedMap<Integer, String> INT_TO_WORD =
       new ImmutableSortedMap.Builder<>(Ordering.natural())
           .put(1, "one")
           .put(2, "two")
           .put(3, "three")
           .build();
Run Code Online (Sandbox Code Playgroud)

而这一个确实如此

ImmutableSortedMap<Integer, String> INT_TO_WORD =
       new ImmutableSortedMap.Builder<Integer, String>(Ordering.natural())
           .put(1, "one")
           .put(2, "two")
           .put(3, "three")
           .build();
Run Code Online (Sandbox Code Playgroud)

为什么我需要在rhs何时指定类型lhs?是否有更多的东西给<>操作员而不是眼睛.

gee*_*rt3 6

这与例如不同

ArrayList<String> l = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

这里new右侧有效地创建了ArrayList.

在您的示例中,new创建一个完全不同的类型,即Builder仅在最后ImmutableSortedMapbuild()方法创建.编译器无法知道Builder <>与ImmutableSortedMap有什么关系.

或者用一个愚蠢的例子,这可能是完全有效的:

ArrayList<String> l = new SomethingSilly<Boolean>().getArrayListOfStrings();
Run Code Online (Sandbox Code Playgroud)