Идея. Внутренняя ошибка компилятора 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)
…
Другие вопросы по тегам