为什么相同的代码在 Eclipse 中有效,但在 IntelliJ 中甚至无法编译

Why same code works in Eclipse but doesn't even compile in IntelliJ

这里有 2 个代码片段,它们应该 return 与我在 map factory 中使用 HashMap 相同的结果。 但是第二个代码片段无法在 IntelliJ 中编译。这两个代码在 Eclipse 中都可以正常工作。

System.out.println 方法需要一些可以调用 toString 的东西,但是在 IntelliJ 中我得到了这个奇怪的错误,为什么?

可编译代码(Eclipse 和 IntelliJ):

 System.out.println(Arrays.stream(str.split(" "))
                          .collect(Collectors.groupingBy(
                                                  Function.identity(), 
                                                  Collectors.counting())));

错误代码(在 Eclipse 中有效,但仅在 IntelliJ 中失败):

  System.out.println(Arrays.stream(str.split(" "))
                            .collect(Collectors.groupingBy(
                                                       Function.identity(), 
                                                       HashMap::new, 
                                                       Collectors.counting())));

IntelliJ 中第二个片段的错误

Required type: String
Provided: Map

<java.lang.String,java.lang.Long> no instance(s) of type variable(s) K, V exist so that HashMap<K, V> conforms to String

似乎是 IntelliJ IDEA 使用的 javac 的错误。相比之下,Eclipse 有自己的编译器。

Java 8 和 11 的 javac 失败,但是如果 collect(...) 中的收集器被提取到 var 变量(自 Java 10) 比 javac of Java 11:

编译没有错误
var collector = Collectors.groupingBy(Function.identity(),
                                      HashMap::new,
                                      Collectors.counting());
System.out.println(Arrays.stream(str.split(" ")).collect(collector));

因此,可以推断收集器类型并在此处使用。

作为 javac 的解决方法,您可以对 Java 8 使用以下代码,其中 var 不可用:

Collector<Object, ?, Map<Object, Long>> collector =
                Collectors.groupingBy(Function.identity(),
                                      HashMap::new,
                                      Collectors.counting());
System.out.println(Arrays.stream(str.split(" ")).collect(collector));