javac - 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 Runnable
为Runnable
或通过将 lambda 显式转换为 来解决Runnable
。
我的问题:这个失败似乎有点“愚蠢”..这种行为是由 JLS 指定的,还是编译器错误?
解决方案
的捕获? super Runnable
表示给定但未知的超类型Runnable
(可能是Object
)。要将类型分类为功能接口,您需要一个上限,而不是下限。推断 lambda 的类型 OTOH 需要一个函数接口作为其目标类型。
推荐阅读
- arrays - 映射时 React 中的过滤器方法不起作用
- javascript - 将模态背景更改为动画背景
- awk - 使用 SED 或 AWK 跨多行查找和替换字符串
- asp.net - 在单独的 Docker 容器中使用数据库时添加迁移会引发错误
- sql - 在 PostgreSQL 中使用 AGE 函数订购时间戳持续时间
- regex - 如何匹配正则表达式中的不同组
- javascript - 如何使用javascript将json数据格式从数组更改为对象数组?
- javascript - 如何使用选定的下拉列表使用受尊重的时区进行日期时间选择器?
- c# - 查找两个数组之间的匹配序列(模式匹配)C#
- node.js - 路径“/tmp/build_.../client/package.json”没有这样的文件或目录