科特林无法在可流动

科特林无法在可流动

问题描述:

使用方法引用时,我有这样的代码在Java中推断类型:科特林无法在可流动

Flowable.just(1,2,3) 
     .flatMap(Flowable::just); 

这个代码在科特林:

Flowable.just(1,2,3) 
     .flatMap(Flowable::just) 

虽然Java代码编译罚款,科特林编译器说: :“错误:(47,30)Kotlin:对于类的一个类型参数Flowable:在io.reactivex中定义的发布者”

但是,这编写得很好:

Flowable.just(1,2,3) 
     .flatMap { Flowable.just(it) } 

我在做什么错误或Kotlin如何不能自动推断Flowable的类型?

+0

来自[Kotlin文档](https://kotlinlang.org/docs/reference/lambdas.html):“lambda表达式总是被大括号括起来。” –

这不是一个完全的答案,但它太长了评论。

在第一种不编译的情况下,错误与Kotlin没有选择正确的Flowable::just方法传递给Flowable.flatMap(...)有关。有10个不同的Flowable.just(...)方法定义,其中的差异是参数的数量。

在第二种情况下,您传递Flowable.flatMap()一个明确调用Flowable.just()(即一个参数版本)的单参数版本的lambda。

在第一种情况,科特林显然选择代替寻找一个由Flowable.flatMap()预期的签名相匹配的其它十个Flowable::just方法之一(其中有12定义)。相比之下,Java能够从参数的签名中推断出.just()的许多过载中的哪一个可以通过。

这可能是一个Kotlin的缺点,但我想听听Kotlin编译器专家有什么话要说。