java - Lambda 在 Java 9 中导致编译错误 "incompatible types",在 Java 8 中编译

标签 java lambda java-9

以下代码可以用 Java 8 编译,但不能用 Java 9:

public class CompileErrJdk9 {

    @FunctionalInterface public interface Closure<R> {
        R apply();
    }

    @FunctionalInterface public interface VoidClosure {
        void apply();
    }

    static <R> R call(Closure<R> closure) {
        return closure.apply();
    }

    static void call(VoidClosure closure) {
        call(() -> { closure.apply(); return null; });
    }

    static <T> void myMethod(T data) {
        System.out.println(data);
    }

    public static void main(String[] args) {
        call(() -> myMethod("hello")); //compile error in jdk9
    }
}

这是错误:

CompileErrJdk9.java:24: error: incompatible types: inference variable R has incompatible bounds
        call(() -> myMethod("hello")); //compile error in jdk9
            ^
    upper bounds: Object
    lower bounds: void
  where R is a type-variable:
    R extends Object declared in method <R>call(Closure<R>)
1 error

我已将其缩小到类型参数 <T>myMethod ;如果我放弃它并使用 Object对于代码编译的参数类型。声明 myMethod作为 static <T> void myMethod() { }即使我没有使用 type 参数,也会失败(仅在 9 中)。

我检查了 Java 9 发行说明并搜索了对此行为的解释,但没有找到任何东西。我认为这是 JDK9 中的错误是正确的,还是我遗漏了什么?

最佳答案

Oracle 已将其视为 ID JDK-8191290 的错误:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8191290

更新:该错误已通过注释“已在 10 中修复,不会向后移植”关闭。

关于java - Lambda 在 Java 9 中导致编译错误 "incompatible types",在 Java 8 中编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47260727/

相关文章:

java - Recurcison Java 奇怪的行为,打印节点

kotlin - 根据传入的状态类类型构成 UI 操作的层次结构

c++ - 是否可以在不使用尾随返回类型语法的情况下通过 lambda 引用返回类型为 T 的对象?

java - 使模块 jdk.incubator.httpclient 在运行时可见

maven - Maven 为 JDK9 做好准备了吗?

java - 将 Flash 文件上传与 JSF 集成

java - 当 .stream().parallel() 做同样的事情时,为什么 Collection.parallelStream() 存在?

java - 如何缩短有关 Stringrequest 的代码?

c# - LINQ 中的普通 lambda

关于 serviceloader 的 Java 9 依赖问题