Следующий код компилируется с 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() { }
также не выполняется (только в 9), хотя я не использую параметр типа.
Я проверил заметки о выпуске Java 9 и искал объяснение этого поведения, но ничего не нашел. Правильно ли я предполагаю, что это ошибка в JDK9, или я чего-то не хватает?