Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rx java Kotlin RxJava可为空的错误_Rx Java_Kotlin - Fatal编程技术网

Rx java Kotlin RxJava可为空的错误

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

我在使用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)
}
导入接收。可观察
数据类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有趣!