我在使用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!意思是"T或T?"
这意味着,科特林编译器可以视的返回类型flatMap为无论是功能Observable<TestUser>还是Observable<TestUser?>,甚至Observable<TestUser>?.放松部分说的很多,"我们不想用这些未知的类型打扰你,你可能知道的更好".
由于返回类型是明确给出的getTestUser(),因此它使用第一个.由于该类型observable是不明确给出,但其推断来Observable<TestUser?>,基于该getUser()功能.
正如@voddan评论的那样,有一个讨论这个问题的公开问题:https://youtrack.jetbrains.com/issue/KT-11108
| 归档时间: |
|
| 查看次数: |
681 次 |
| 最近记录: |