Идея. Внутренняя ошибка компилятора Java возникает, когда я пытаюсь назначить int для операции Stream# Reduce, но когда Integer - нет
Я обнаружил следующее странное поведение потоков
Давайте исследуем следующий код:
int summaryAge = Person.getPersons().stream()
.parallel() //will return surprising result
.reduce(0, (intermediateResult, p) -> intermediateResult + p.age,
(ir1, ir2) -> ir1 + ir2);
Идея не выделяет никаких ошибок, но когда я запускаю приложение, я вижу следующую ошибку компиляции:
Error:java: Compilation failed: internal java compiler error
но когда я заменяю его с помощью Integer
как это:
Integer summaryAge = Person.getPersons().stream()
.parallel() //will return surprising result
.reduce(0, (intermediateResult, p) -> intermediateResult + p.age,
(ir1, ir2) -> ir1 + ir2);
Работает нормально.
модель:
public class Person {
String name;
Integer age;
///...
public static Collection<Person> getPersons() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Vasya", 12));
persons.add(new Person("Petya", 32));
persons.add(new Person("Serj", 10));
persons.add(new Person("Onotole", 18));
return persons;
}
}
Это ошибка идеи или компилятора?
1 ответ
Я могу подтвердить, что существует проблема, которая, как ни странно, не возникает при запуске компилятора из командной строки. Я объединил ваши фрагменты кода в один файл:
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class Person {
String name;
Integer age;
///...
Person(String n, int a) {
name=n;
age=a;
}
public static Collection<Person> getPersons() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Vasya", 12));
persons.add(new Person("Petya", 32));
persons.add(new Person("Serj", 10));
persons.add(new Person("Onotole", 18));
return persons;
}
public static void main(String... arg) {
int summaryAge = Person.getPersons().stream()
.parallel() //will return surprising result
.reduce(0, (intermediateResult, p) -> intermediateResult + p.age,
(ir1, ir2) -> ir1 + ir2);
}
}
При компиляции с javac
(1.8.0_60) из командной строки, проблем нет. При запуске того же компилятора из моей установки Netbeans (8.0.2 patch 2), я получаю
java.lang.NullPointerException
at com.sun.tools.javac.code.Types.isConvertible(Types.java:292)
at com.sun.tools.javac.comp.Check.assertConvertible(Check.java:933)
at com.sun.tools.javac.comp.Check.checkMethod(Check.java:887)
at com.sun.tools.javac.comp.Attr.checkMethod(Attr.java:4054)
at com.sun.tools.javac.comp.Attr.checkIdInternal(Attr.java:3826)
at com.sun.tools.javac.comp.Attr.checkMethodIdInternal(Attr.java:3733)
at com.sun.tools.javac.comp.Attr.checkMethodId(Attr.java:3710)
at com.sun.tools.javac.comp.Attr.checkId(Attr.java:3698)
at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:3581)
at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1903)
…