Идея. внутренняя ошибка компилятора 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;
   }
}

Это ошибка идеи или компилятора?


person gstackoverflow    schedule 01.10.2015    source источник
comment
Ваш первый фрагмент кода отлично компилируется для меня (запуск javac 1.8.0_51 с Maven)   -  person Tunaki    schedule 01.10.2015
comment
@Tunaki Я использую идею. dl2.joxi.net/drive/0005/3037/338909/ 151001/b29bd185b8.jpg   -  person gstackoverflow    schedule 01.10.2015
comment
похоже, мы используем ту же версию jdk   -  person gstackoverflow    schedule 01.10.2015
comment
Если вы спрашиваете, является ли это ошибкой компилятора (и все, что говорит о внутренней ошибке компилятора!), вы должны сообщить нам, какую версию компилятора вы используете....   -  person Brian Goetz    schedule 01.10.2015
comment
Компилятор IntelliJ выдает ошибку или это javac?   -  person Tunaki    schedule 01.10.2015
comment
Хм. Я установил идею и использую конфигурацию по умолчанию   -  person gstackoverflow    schedule 01.10.2015


Ответы (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)
…
person Holger    schedule 01.10.2015