Java 为什么Flux.zip接受预定义函数而不是匿名函数?

Java 为什么Flux.zip接受预定义函数而不是匿名函数?,java,reactive-programming,project-reactor,flux,Java,Reactive Programming,Project Reactor,Flux,在java中学习Flux(反应核心)时,我遇到了以下关于函数的问题 这是Flux.zip()方法签名: public static <I, O> Flux<O> zip( final Function<? super Object[], ? extends O> combinator, Publisher<?extends I>... sources) { return zip(comb

java
中学习Flux(反应核心)时,我遇到了以下关于函数的问题

这是
Flux.zip()
方法签名:

 public static <I, O> Flux<O> zip(
      final Function<? super Object[], ? extends O> combinator, 
                    Publisher<?extends I>... sources) {
   return zip(combinator, Queues.XS_BUFFER_SIZE, sources);
}
公共静态流量压缩(

final Function不是编译器专家,但我认为这与java编译器看到缩写lambda的歧义有关:您传递的是内联
发布者(因为它是函数接口)还是
函数

这种混淆是可能的,因为简短的表单没有明确的
return
语句:在
Publisher
选项的情况下,这意味着您创建了一个
用户
,以便立即被垃圾收集,但编译器不会禁止您这样做

因此,lambda的目标类型被假定为
发布者
,因此
数组
被推断为
订阅者
。但随后对其使用了数组索引运算符,这肯定是错误的

另一方面,将
{}
放在括号中,通过在推理中使用显式的
返回类型来消除歧义。对于编译器,您不能再表示
发布者,因此使用下一个候选(
函数

消除歧义的另一种方法是向编译器显示
数组
是一个数组:

Flux.zip((Object[] array) -> new User(array[0].toString(),array[1].toString(), array[2].toString())
                , usernameFlux, firstnameFlux, lastnameFlux);
Flux.zip((Object[] array) -> new User(array[0].toString(),array[1].toString(), array[2].toString())
                , usernameFlux, firstnameFlux, lastnameFlux);