Почему тот же код работает в Eclipse, но даже не компилируется в IntelliJ - PullRequest
4 голосов
/ 12 января 2020

Вот 2 фрагмента кода, которые должны возвращать тот же результат, который я использовал HashMap в map factory. Но второй фрагмент кода не компилируется в 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

1 Ответ

5 голосов
/ 12 января 2020

Это кажется ошибкой javac, которая используется IntelliJ IDEA. Напротив, Eclipse имеет свой собственный компилятор.

Сбой при javac из Java 8 и 11, но если коллектор в collect(...) извлекается в переменную var (доступно с Java 10) чем он компилируется без ошибок с javac из 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));
...