JDK 8 update 20中是否存在类型推断回归?

Ben*_*ine 25 java java-8

我有以下代码的问题:

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<>());
Run Code Online (Sandbox Code Playgroud)

使用JDK 8直到更新11,此代码编译.使用JDK 8 update 20,它不再编译.在最后一个语句中,我必须显式指定String最后一个HashSet实例化的类型参数.

我想知道这个代码是否错误,或者它是否是最后一次JDK更新中的回归.

Stu*_*rks 7

这是JDK 8u20更新版本和当前JDK 9开发分支中存在的新错误.此代码之前有效,所以是的,这将被视为回归.JDK langtools团队提交了以下错误报告:

JDK-8055963嵌套调用的推理失败

从评论来看,似乎当前行为实际上符合规范(JLS),但行为显然是错误的,因此可能需要澄清规范.

请注意,这是与其他StackOverflow问题Java 1.8.20编译器错误,错误JDK-8051402中报告的类型推断错误.该错误已经修复,但修复程序不在JDK 8u20中.