不是功能接口,javac,jls"/>

首页 > 解决方案 > Java 类型推断失败:不是功能接口

问题描述

使用 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 RunnableRunnable或通过将 lambda 显式转换为 来解决Runnable

我的问题:这个失败似乎有点“愚蠢”..这种行为是由 JLS 指定的,还是编译器错误?

标签: javacjls

解决方案


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


推荐阅读