为什么相同的代码在 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));
这里有 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));