为什么在这种情况下使用方法引用而不是 lambda 会导致编译错误?

Mat*_*isz 8 java

我有以下代码:

final var fieldValuesStream = items.stream()
                .map(person -> PersonFieldGetter.getFieldValueAsNumber(functionsParameters.getFieldName(), person)) // Number
                .mapToDouble(number -> number.doubleValue());
Run Code Online (Sandbox Code Playgroud)

IDEA 突出显示“number -> number.doubleValue()”并显示以下消息:

Lambda 可以替换为方法引用
将 Lambda 替换为方法引用

但是当我将代码更改为.mapToDouble(Number::doubleValue)编译错误时发生:

QueryProcessor.java:31:34 java: 不兼容的类型:类 java.lang.Number 中的无效方法引用方法 doubleValue 无法应用于所需的给定类型:未找到参数:java.lang.Object 原因:实际参数列表和形式参数列表不同长度

完整源代码
为什么会发生这种情况?

重现问题的项目

编辑:添加了 GitHub 项目的链接,其中包含无法使用以下命令构建的示例项目:

IntelliJ IDEA 2021.2.3 (Ultimate Edition)
Build #IU-212.5457.46,构建于 2021 年 10 月 12 日
运行时版本:11.0.12+7-b1504.40 amd64
VM:OpenJDK 64 位服务器 VM by JetBrains sro
SDK:Oracle OpenJDK 17.0.1

sam*_*cde 2

不是答案,旨在为其他人提供一个简化的可重现示例来解决问题。

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List.of(0.1d).stream().map(aDouble -> {
                    return List.of(1).stream().map(p -> aDouble).mapToDouble(Number::doubleValue);
                }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

aDouble似乎问题是编译器无法识别嵌套流中的类型并导致一些奇怪的错误。

一些让它编译的方法

  1. 删除退货
        Stream.of(0.1d).map(aDouble ->
                List.of(1).stream().map(p -> aDouble).mapToDouble(Double::doubleValue)
        );
Run Code Online (Sandbox Code Playgroud)
  1. 指定类型aDouble
        Stream.of(0.1d).map((Double aDouble) -> {
                    return List.of(1).stream().map(p -> aDouble).mapToDouble(Double::doubleValue);
                }
        );
Run Code Online (Sandbox Code Playgroud)
  1. 不使用方法参考
        Stream.of(0.1d).map(aDouble -> {
                    return List.of(1).stream().map(p -> aDouble).mapToDouble(d -> d.doubleValue());
                }
        );
Run Code Online (Sandbox Code Playgroud)