我遇到以下代码的问题:
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更新中的回归。
答案 0 :(得分:7)
这是JDK 8u20更新版本和当前JDK 9开发分支中存在的新错误。此代码之前有效,所以是的,这将被视为回归。 JDK langtools团队提交了以下错误报告:
JDK-8055963嵌套调用的推理失败
从评论来看,似乎当前行为实际上符合规范(JLS),但行为显然是错误的,因此可能需要澄清规范。
请注意,这是与其他StackOverflow问题Java 1.8.20 Compiler Error中报告的错误类型推断错误,错误JDK-8051402。该错误已经修复,但JDK 8u20中没有修复。