使用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
,或将lambda显式转换为Runnable
,很容易解决。
我的问题:此故障似乎有点“愚蠢”。.这是JLS指定的行为,还是编译器错误?
答案 0 :(得分:0)
捕获? super Runnable
表示给定但未知的Runnable
超级类型(可能是Object
)。要将类型分类为功能接口,您需要一个上限,而不是一个下限。推断lambda的类型OTOH,需要一个函数接口作为其目标类型。