java - JDK 11.0.2 编译因匿名参数化类类型推断上的 javac NPE 而失败

标签 java javac type-inference java-11 compiler-bug

代码 (spring-web 5.1.2)

public static void main(String[] args) {
    RestTemplate restTemplate = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.set(HttpHeaders.AUTHORIZATION, "token");
    HttpEntity<Object> requestEntity = new HttpEntity<>(headers);

    ResponseEntity<Object> test = restTemplate.exchange(
            "https://example.com",
            HttpMethod.GET,
            new HttpEntity<>(headers),
            new ParameterizedTypeReference<>() { // fails here
            });
}

OracleJDK 1.8(预期输出)

cannot infer type arguments for org.springframework.core.ParameterizedTypeReference

reason: cannot use '<>' with anonymous inner classes

OracleJDK 11.0.2(不是预期的输出)

compiler message file broken: key=compiler.misc.msg.bug arguments=11.0.2, {1}, {2}, {3}, {4}, {5}, {6}, {7} java.lang.NullPointerException at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitApply(Flow.java:1235) at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1634) at jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer.scan(Flow.java:398) at jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitVarDef(Flow.java:989)
...

如果我将菱形运算符更改为显式类型

new ParameterizedTypeReference<>(){}new ParameterizedTypeReference<Object>(){}

然后代码在两个 JDK 上都成功编译。

这是一个已知的编译器错误吗?

最佳答案

错误 ( JDK-8212586 ) 已经提交并且 fixed在第 12 版中。

最小的、可验证的例子:

public static void main(String[] args) {
    new Bug<>(){};
}

static class Bug<T> {

    Bug() {
        test(new ParameterizedTypeReference<>(){});
    }

    void test(ParameterizedTypeReference<T> typeReference) {
    }
}

Some Details.


修复也已反向移植到 JDK 11 - https://bugs.openjdk.java.net/browse/JDK-8220578 .

从 JDK 11.0.4 开始可用。

关于java - JDK 11.0.2 编译因匿名参数化类类型推断上的 javac NPE 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54775253/

相关文章:

java - 如何在 JTable 中使用 Jtable 列按钮渲染来渲染图像?

java - RCP 应用程序找不到新添加的 View

java - 重定向 java 和 javac 输出

javac错误: inconvertible types with generics?

Java泛型不可能赋值?

java - Android 中的 3D 游戏

java - playframework 2.3.x 堆大小

web-services - ANT build.xml 中包的 Javac 排除

c# - 为什么类型推断和隐式运算符在以下情况下不起作用?

scala - 有没有一种方法可以在Scala中指定类型参数的子集,从而推断其余部分?