为什么相同的代码可以在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。