Kotlin RxJava Nullable Bug

bcl*_*mer 11 kotlin rx-java

我在使用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)
}
Run Code Online (Sandbox Code Playgroud)

getTestUser2,编译器推断最终返回类型为Observable<TestUser?>和不编译.然而,getTestUser在代码中进行编译,并且当它运行时,该可观察对象的任何订阅者可能会在TestUser回来时感到意外null.

我猜这与在Kotlin和Java之间来回走动有关.但是,编译器可以看到差异的事实getTestUser2使我认为这可以解决.

编辑

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

nha*_*man 10

flatMap在Kotlin中使用时,该功能的签名如下:

public final fun <R: Any!, T: Any!> 
    Observable<T>.flatMap(
      func: ((T) -> Observable<out R!>!)!
    ) : Observable<R!>!
Run Code Online (Sandbox Code Playgroud)

来自文档:

Java中的任何引用都可能是null,这使得Kotlin对严格的null安全性的要求对来自Java的对象不切实际.Java声明的类型在Kotlin中被特别处理并称为平台类型.对这些类型放宽空检查,因此对它们的安全保证与Java相同

T!意思是" TT?"

这意味着,科特林编译器可以视的返回类型flatMap为无论是功能Observable<TestUser>还是Observable<TestUser?>,甚至Observable<TestUser>?.放松部分说的很多,"我们不想用这些未知的类型打扰你,你可能知道的更好".

由于返回类型是明确给出的getTestUser(),因此它使用第一个.由于该类型observable明确给出,但其推断来Observable<TestUser?>,基于该getUser()功能.


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

  • 该团队证实这是一个错误.问题:https://youtrack.jetbrains.com/issue/KT-11108 (2认同)