Rx java Kotlin RxJava可为空的错误
我在使用Kotlin和RxJava的Android应用程序中遇到了一个问题。它在下面展示Rx java Kotlin RxJava可为空的错误,rx-java,kotlin,Rx Java,Kotlin,我在使用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 getT
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)
}
导入接收。可观察
数据类TestUser(val名称:字符串)
fun getTestUser():可观察{
返回Observable.just(TestUser(“Brian”)).flatMap{getUser()}//编译
}
fun getTestUser2():可观察{
val observable=observable.just(TestUser(“Brian”)).flatMap{getUser()}
return observable//this不编译
}
fun getUser():可观察{
返回可观察值。刚好(空)
}
在getTestUser2
中,编译器将最终返回类型推断为Observable
,并且不编译。然而,在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!>!
public final fun
可观测平面图(
func:((T)->可观察!)!
):可见!
从文档中:
Java中的任何引用都可能是null
,这使得Kotlin的需求
对于来自Java的对象来说,严格的空安全性是不切实际的。类型
在Kotlin中专门处理Java声明的
平台类型。对此类类型放宽了空检查,以确保安全性
它们的保证与Java中的相同
及
T代码>表示“T
或T?
”
这意味着Kotlin编译器可以将flatMap
函数的返回类型视为Observable
或Observable
,甚至是Observable?
。放松部分说的是“我们不想用这些未知类型来打扰你,你可能知道得更清楚”
由于返回类型在getTestUser()
中显式给出,因此它使用第一个。由于未明确给出可观察的类型
,因此它根据getUser()
函数将其推断为可观察的
正如@voddan所评论的,有一个公开问题在讨论这个问题:我想,这就是他们正在使用的问题跟踪程序:。如果您创建了一个bug报告,那么您很可能会收到语言创建者的确认/解释。团队确认这是一个bug。问题是:接受这个。经过充分研究和介绍。这是有道理的。我可能会通过在返回值之前赋值(如第二个示例中所示)来开始更明确的操作。我想要所有我能得到的类型安全。这很奇怪。没有类型声明的赋值不应该改变任何东西。团队确认这是一个bug。问题:@voddan有趣!