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

标签 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<>());

在更新 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/

相关文章:

java - 无法更改 JLabel 的文本

java - 线程 "main"java.awt.AWTError : Assistive Technology not found 中的异常

java - 什么时候使用抽象工厂模式?

java - Maven编译报错try-with-resources

java - 如何在 Java GUI 中添加过渡(淡入淡出、溶解等)

java - 扫描仪输入流未定义..?

java - ForkJoinPool - 为什么程序抛出 OutOfMemoryError?

java - JDK8与Windows XP兼容吗?

java - LongAdder 是 ID 生成器的错误选择吗?

Java 8 泛型兼容性