我对以下代码有疑问:
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<>());
在更新 11 之前使用 JDK 8,此代码可以编译。
使用 JDK 8 update 20,它不再编译。在最后一个语句中,我必须为最后一个 HashSet
实例化显式指定 String
类型参数。
我想知道我的代码是否有问题,或者它是否是上次 JDK 更新中的回归。
最佳答案
这是 JDK 8u20 更新版本和当前 JDK 9 开发分支中存在的一个新错误。该代码以前有效,所以是的,这将被视为回归。 JDK langtools 团队提交了以下错误报告:
JDK-8055963 Inference failure with nested invocation
从评论来看,目前的行为似乎确实符合规范(JLS),但行为显然是错误的,因此可能需要对规范进行澄清。
请注意,这是与另一个 StackOverflow 问题 Java 1.8.20 Compiler Error 中报告的错误不同的类型推断错误。 , 错误 JDK-8051402 .该错误已被修复,但该修复不在 JDK 8u20 中。
关于java - JDK 8 update 20 中是否存在类型推断回归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490581/