Lambda 在 Java 9 中导致编译错误“不兼容类型”,在 Java 8 中编译

2022-09-02 14:02:47

以下代码使用 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

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

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


答案 1

Oracle 已将此作为 ID JDK-8191290 的错误:

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

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


答案 2

推荐