下面的代码可以使用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
我已经将其范围缩小到myMethod
的类型参数<T>
;如果删除它并使用Object
作为参数类型,代码将编译。将myMethod
声明为static <T> void myMethod() { }
也会失败(仅在9中),即使我没有使用类型参数。
我查看了Java 9发行说明,并搜索了对此行为的解释,但没有找到任何东西。我是不是认为这是JDK9中的一个bug,或者我错过了什么?
发布于 2017-11-15 16:07:23
Oracle已将其视为ID为JDK-8191290的错误:
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8191290
更新:错误被关闭,注释为"Fixed in 10,with‘t backport“。
https://stackoverflow.com/questions/47260727
复制相似问题