gpt4 book ai didi

rx-java - Kotlin RxJava 可空的错误

转载 作者:IT老高 更新时间:2023-10-28 13:35:04 25 4
gpt4 key购买 nike

我在使用 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代码确实会编译,并且当它运行时,该 observable 的任何订阅者都可能会在 TestUser 时感到惊讶。回来了null .

我猜这与在 Kotlin 和 Java 之间来回切换有关。但是,编译器可以看到 getTestUser2 中的差异这一事实让我觉得这可以解决。

编辑

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

最佳答案

flatMap 的签名在 Kotlin 中使用时函数如下:

public final fun <R: Any!, T: Any!> 
Observable<T>.flatMap(
func: ((T) -> Observable<out R!>!)!
) : Observable<R!>!

来自文档:

Any reference in Java may be null, which makes Kotlin’s requirements of strict null-safety impractical for objects coming from Java. Types of Java declarations are treated specially in Kotlin and called platform types. Null-checks are relaxed for such types, so that safety guarantees for them are the same as in Java

T! means “T or T?

这意味着 Kotlin 编译器可以将 flatMap 的返回类型视为用作Observable<TestUser>Observable<TestUser?> ,甚至Observable<TestUser>? .放松部分说了这么多,“我们不想用这些未知类型来打扰你,你可能知道得更好”。

由于返回类型在 getTestUser() 中明确给出,它使用第一个。由于 observable 的类型没有明确给出,它推断为 Observable<TestUser?> ,基于 getUser()功能。


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

关于rx-java - Kotlin RxJava 可空的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35441280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com