我在使用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/