科特林无法在可流动
问题描述:
使用方法引用时,我有这样的代码在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的类型?
答
这不是一个完全的答案,但它太长了评论。
在第一种不编译的情况下,错误与Kotlin没有选择正确的Flowable::just
方法传递给Flowable.flatMap(...)
有关。有10个不同的Flowable.just(...)
方法定义,其中的差异是参数的数量。
在第二种情况下,您传递Flowable.flatMap()
一个明确调用Flowable.just()
(即一个参数版本)的单参数版本的lambda。
在第一种情况,科特林显然选择代替寻找一个由Flowable.flatMap()
预期的签名相匹配的其它十个Flowable::just
方法之一(其中有12定义)。相比之下,Java能够从参数的签名中推断出.just()
的许多过载中的哪一个可以通过。
这可能是一个Kotlin的缺点,但我想听听Kotlin编译器专家有什么话要说。
来自[Kotlin文档](https://kotlinlang.org/docs/reference/lambdas.html):“lambda表达式总是被大括号括起来。” –