java - Lambda 表达式如何在 Java 中推断类型?
问题描述
我目前正在尝试了解 Java 如何推断 lambda 表达式的类型。我可以用一个例子来说明:
写作:
producer.send(record, new Callback() {
public void onCompletion(RecordMetadata metadata, Exception exception) {
if (exception == null) {
logger.info("Received new metadata"
);
} else {
logger.error("Error while producing " + exception);
我的 IDE 建议可以重写为:
producer.send(record, (metadata, exception) -> {
if (exception == null) {
logger.info("Received new metadata"
);
} else {
logger.error("Error while producing " + exception);
}
这让我想到:编译器如何猜测元数据和异常的类型?
阅读了一些这样的文章,我发现:
Java 8 还引入了 Lambda 表达式。Lambda 表达式没有明确的类型。它们的类型是通过查看上下文或情况的目标类型来推断的。表达式的 Target-Type 是 Java 编译器期望的数据类型,具体取决于表达式出现的位置。
我不确定“上下文或情况”是什么意思。我正在寻找关于编译器如何推断类型的更好的技术解释。我什么时候需要明确标记类型。
解决方案
producer.send
是一种接受记录和 a 的方法Callback
,并且Callback
只有一个抽象方法,它接受 aRecordMetadata
和 a Exception
。因此,如果编译器将 lambda 视为 的第二个参数producer.send
,则它必须实现该方法Callback.onCompletion
,并且它必须有两个参数,第一个为 a RecordMetadata
,第二个为 an Exception
。
关键是:它是从您将 lambda 传递给的方法的类型推断出来的。
推荐阅读
- zsh - zsh 数组分配和无匹配错误
- c# - .NET Core EF Core 2 Models in 1 View 创建操作
- postgis - 如何修复来自 ogr2ogr 的“JSON 解析错误:继续(偏移 XXXX)”错误
- typescript - TypeORM 枚举未检测到正确的参数
- ios - iPhone 拒绝了启动请求 - 在配置文件中
- javascript - 如何在 mongodb 上保存 blob
- sql - 将数据从 Oracle 数据库 11G 传输到 MongoDB
- r - R - 使用数据框中的最后一个已知和速率预测值
- java - 无法在 Java 11 中独立构建 Selenium
- php - 执行一个带有值的 PHP 文件