首页 > 解决方案 > 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 编译器期望的数据类型,具体取决于表达式出现的位置。

我不确定“上下文或情况”是什么意思。我正在寻找关于编译器如何推断类型的更好的技术解释。我什么时候需要明确标记类型。

标签: java

解决方案


producer.send是一种接受记录和 a 的方法Callback,并且Callback只有一个抽象方法,它接受 aRecordMetadata和 a Exception。因此,如果编译器将 lambda 视为 的第二个参数producer.send,则它必须实现该方法Callback.onCompletion,并且它必须有两个参数,第一个为 a RecordMetadata,第二个为 an Exception

关键是:它是从您将 lambda 传递给的方法的类型推断出来


推荐阅读