Java方法引用返回值推断与直接调用不一致报错求解
报错根因分析
这个报错的核心是方法引用对应的函数式接口签名和接收变量的类型签名不匹配,具体拆解如下:
- 首先明确
Supplier<T>函数式接口的定义:它仅包含一个无参数的抽象方法T get(),作用是生产一个类型为T的实例。 - 你声明的变量类型是
Supplier<Stream<Integer>>,意味着这个变量需要接收的是「无参数、返回值类型为Stream<Integer>」的函数实现。 - 你引用的
makeIntegerStream方法本身的签名是无参数、返回值为Supplier<Stream<Integer>>,所以StreamChain::makeIntegerStream这个方法引用对应的实际类型是Supplier<Supplier<Stream<Integer>>>:它的get()方法调用后返回的是Supplier<Stream<Integer>>类型,不是你需要的Stream<Integer>类型。 - 编译器提示的
Supplier<Stream<Integer>> cannot be converted to Stream<Integer>正是指这个类型不匹配:方法引用的返回值类型和目标Supplier要求的返回值类型对不上。
补充说明
你直接调用StreamChain.makeIntegerStream()的写法可以正常编译,是因为这个方法调用的返回值本身就是Supplier<Stream<Integer>>,和变量stream2的类型完全一致,自然没有问题。
解决方案(二选一即可)
- 修改变量类型匹配方法引用:
Supplier<Supplier<Stream<Integer>>> stream1 = StreamChain::makeIntegerStream; // 后续获取Stream需要调用两次get:stream1.get().get() - 修改
makeIntegerStream方法签名匹配目标Supplier:private static Stream<Integer> makeIntegerStream() { return Stream.of(2,5,8,1,5,90,24); } // 此时方法引用就可以正常赋值给Supplier<Stream<Integer>>类型变量
内容的提问来源于stack exchange,提问作者No_One
相关产品推荐
相关产品推荐

