【问题标题】:Kotlin unable to infer type when using method reference in Flowable在 Flowable 中使用方法引用时,Kotlin 无法推断类型
【发布时间】:2018-01-21 08:00:31
【问题描述】:

我在 Java 中有这段代码:

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

Kotlin 中的这段代码:

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

虽然 Java 代码可以正常编译,但 Kotlin 编译器会说:“错误:(47, 30) Kotlin: One type argument expected for class Flowable : Publisher defined in io.reactivex”

但是这编译得很好:

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

我做错了什么或者为什么 Kotlin 不能自动推断 Flowable 的类型?

【问题讨论】:

  • 来自Kotlin docs:“lambda 表达式总是用花括号括起来。”

标签: kotlin type-inference rx-java2 flatmap


【解决方案1】:

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

在第一种无法编译的情况下,错误与 Kotlin 未选择正确的 Flowable::just 方法传递给 Flowable.flatMap(...) 有关。定义了 10 种不同的 Flowable.just(...) 方法,区别在于参数的数量。

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

在第一种情况下,Kotlin 显然选择了其他十个 Flowable::just 方法之一,而不是寻找与 Flowable.flatMap() 预期的签名匹配的一个(其中定义了 12 个)。相比之下,Java 能够(从参数的签名)推断出.just() 的许多重载中的哪一个要传递。

这可能是 Kotlin 的一个缺点,但我想听听一位 Kotlin 编译器专家怎么说。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多