我在使用Kotlin和RxJava的Android应用程序中遇到了一个问题。如下所示。

import rx.Observable

data class TestUser(val name: String)

fun getTestUser(): Observable<TestUser> {
    return Observable.just(TestUser("Brian")).flatMap { getUser() } // this compiles
}

fun getTestUser2(): Observable<TestUser> {
    val observable = Observable.just(TestUser("Brian")).flatMap { getUser() }
    return observable // this does not compile
}

fun getUser(): Observable<TestUser?> {
    return Observable.just(null)
}

getTestUser2中,编译器将最终返回类型推断为Observable<TestUser?>,并且不进行编译。但是,在getTestUser中,代码确实可以编译,并且在运行时,当TestUser返回null时,该可观察对象的任何订阅者都可能会感到惊讶。

我猜这与Kotlin和Java之间来回相关。但是,编译器可以看到getTestUser2的差异这一事实使我认为这是可以修复的。

编辑

这是在Kotlin 1.0上发布的,最终版本是在昨天(2016年2月15日)发布的。

最佳答案

在Kotlin中使用时,flatMap函数的签名如下:

public final fun <R: Any!, T: Any!>
    Observable<T>.flatMap(
      func: ((T) -> Observable<out R!>!)!
    ) : Observable<R!>!

从文档中:







这意味着Kotlin编译器可以将flatMap函数的返回类型视为Observable<TestUser>Observable<TestUser?>,甚至是Observable<TestUser>?。放松部分这么说,“我们不想用这些未知类型来打扰您,您可能更了解”。

由于返回类型是在getTestUser()中明确指定的,因此它使用第一个。由于没有明确给出observable的类型,因此它根据Observable<TestUser?>函数将其推断为getUser()

正如@voddan所评论的那样,存在一个讨论此问题的公开问题:https://youtrack.jetbrains.com/issue/KT-11108

关于rx-java - Kotlin RxJava可空错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35441280/

10-10 18:25