Java类型推断失败:<captured wildcard =“”>不是功能接口

时间:2019-03-21 16:31:47

标签: javac jls

使用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指定的行为,还是编译器错误?

1 个答案:

答案 0 :(得分:0)

捕获? super Runnable表示给定但未知的Runnable超级类型(可能是Object)。要将类型分类为功能接口,您需要一个上限,而不是一个下限。推断lambda的类型OTOH,需要一个函数接口作为其目标类型。