Подтвердить что ты не робот

Есть ли регрессия вывода типа в JDK 8 update 20?

У меня проблема со следующим кодом:

public static <T> T firstNonNull(@Nullable T first, @Nullable T second) {
    return first != null ? first : second;
}

public static Set<String> getStrings() {
   return new HashSet<>();
}

public static Set<String> doesNotCompile = firstNonNull(getStrings(), new HashSet<>());

С JDK 8 до обновления 11 этот код компилируется. С JDK 8 update 20 он больше не компилируется. В последнем утверждении я должен явно указать аргумент типа String для последнего экземпляра HashSet.

Мне было интересно, не ошибаюсь ли я в этом коде или регрессия в последнем обновлении JDK.

4b9b3361

Ответ 1

Это новая ошибка, существующая в выпуске обновления JDK 8u20 и в текущей ветке разработки JDK 9. Этот код работал раньше, поэтому да, это будет считаться регрессией. Команда langtools JDK представила следующий отчет об ошибке:

JDK-8055963 Ошибка вывода с вложенным вызовом

Судя по комментариям, похоже, что текущее поведение действительно соответствует спецификации (JLS), но поведение явно неверно, поэтому может потребоваться уточнение спецификации.

Обратите внимание, что это ошибка вывода другого типа из сообщения, указанного в этом другом вопросе StackOverflow Java 1.8.20 Ошибка компилятора, ошибка JDK-8051402. Эта ошибка уже исправлена, хотя исправление не находится в JDK 8u20.