При использовании компилятора java 8 эта программа:
import java.util.function.Consumer;
public class xx {
public void execute(Consumer<? super Runnable> executor, Runnable action) {
executor.accept(() -> action.run());
}
}
завершается с ошибкой:
xx.java:4: error: incompatible types: <captured wildcard> is not a functional interface
executor.accept(() -> action.run());
^
Очевидно, что компилятору не удалось определить тип () -> action.run()
.
Это легко исправить, либо изменив ? super Runnable
на Runnable
, либо явным образом приведя лямбду к Runnable
.
Мой вопрос: этот сбой кажется "тупым" ... такое поведениеопределяется JLS, или это ошибка компилятора?