为什么相同的代码可以在Eclipse中工作,但不能';我甚至不能用IntelliJ编译

为什么相同的代码可以在Eclipse中工作,但不能';我甚至不能用IntelliJ编译,eclipse,intellij-idea,java-8,intellij-14,Eclipse,Intellij Idea,Java 8,Intellij 14,这里有两个代码片段,它们应该返回相同的结果,正如我在map工厂中使用的HashMap。 但是第二个代码段没有在IntelliJ中编译。这两个代码在Eclipse中都可以正常工作 System.out.println方法需要一些它可以调用toString的东西,但是在IntelliJ中我遇到了这个奇怪的错误,为什么 可编译代码(Eclipse和IntelliJ): System.out.println(Arrays.stream(str.split(" "))

这里有两个代码片段,它们应该返回相同的结果,正如我在
map工厂
中使用的
HashMap
。 但是第二个代码段没有在IntelliJ中编译。这两个代码在Eclipse中都可以正常工作

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

可编译代码(Eclipse和IntelliJ):

 System.out.println(Arrays.stream(str.split(" "))
                          .collect(Collectors.groupingBy(
                                                  Function.identity(), 
                                                  Collectors.counting())));
  System.out.println(Arrays.stream(str.split(" "))
                            .collect(Collectors.groupingBy(
                                                       Function.identity(), 
                                                       HashMap::new, 
                                                       Collectors.counting())));
错误代码(在Eclipse中工作,但仅在IntelliJ中失败):

 System.out.println(Arrays.stream(str.split(" "))
                          .collect(Collectors.groupingBy(
                                                  Function.identity(), 
                                                  Collectors.counting())));
  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
所需类型:字符串
提供:地图
不存在类型变量K,V的实例,因此HashMap符合字符串

这似乎是IntelliJ IDEA使用的
javac
的一个bug。相反,Eclipse有自己的编译器

Java 8和11的
javac
会失败,但是如果
collect(…)
中的收集器被提取到
var
变量(自Java 10起可用),那么它使用Java 11的
javac
编译时不会出错:

var collector = Collectors.groupingBy(Function.identity(),
                                      HashMap::new,
                                      Collectors.counting());
System.out.println(Arrays.stream(str.split(" ")).collect(collector));
因此,这里可以推断并使用收集器类型

作为
javac
的变通方法,您可以在
var
不可用的地方使用以下Java 8代码:

Collector<Object, ?, Map<Object, Long>> collector =
                Collectors.groupingBy(Function.identity(),
                                      HashMap::new,
                                      Collectors.counting());
System.out.println(Arrays.stream(str.split(" ")).collect(collector));
收集器=
Collectors.groupingBy(Function.identity(),
HashMap::新建,
收集器。计数();
System.out.println(Arrays.stream(str.split(“”).collect(collector));

这段代码对我来说很好,没有错误。谢谢你指出它。。。在您的评论之后,我在eclipse中尝试了相同的代码,并且效果良好。但在IntelliJ中,它甚至不编译。我将重新措辞我的问题,问wy它在IntelliJ中不起作用,但在eclipse中起作用。请发布一个完整的最小示例,再现这个问题,以及从编译器中得到的确切和完整的错误。我想说,因为eclipse使用的是非标准编译器,问题在于eclipse而不是IntelliJ。Eclipse编译器问题有很好的文档记录,这是其中的一个怪癖。@Makoto什么是错的,什么是对的,是由定义的,而不是由标准实现定义的。是的,这就是为什么更容易理解的原因,因为它不像javac那样严格遵循规范。@Makoto这也是错误的。Eclipse编译器for Java是经过Java认证的(否则它甚至不能称为“Java编译器”,因为Java的使用受到需要使用认证的商标的保护)。所以它符合规范,就像规范定义的那样严格。也许规范中存在漏洞,可能会留下分歧的空间,但是,假设Eclipse编译器是错误的,因为它不是javac,这是理解Java世界中规范/认证如何工作的一个重大错误。为了答案的完整性,在IntelliJ IDEA中,您可以将编译器切换到Eclipse编译器(从默认值
javac
)在设置(macOS上的首选项)|构建、执行、部署|编译器| Java编译器|使用编译器并将其设置为Eclipse。