首页 > 解决方案 > 为什么我得到“推断类型是 Observable!但可观察预期”具有可观察的 Kotlin 扩展功能?

问题描述

我有以下扩展功能:

import io.reactivex.Notification
import io.reactivex.Observable
import io.reactivex.subjects.Subject

fun <T> Subject<Notification<T>>.fromNotifications(): Observable<T> {
    return compose {
        it.takeUntil { event ->
            !event.isOnNext
        }.flatMap { event ->
            when {
                event.isOnError -> Observable.error(event.error)
                event.isOnNext -> Observable.just(event.value)
                else -> Observable.empty()
            }
        }
    }
}

我用它来将Subject带有Notification值的 a 转换为普通的Observable

我不太明白为什么我会收到错误

Type inference failed. Expected type mismatch: inferred type is Observable<T?>! but Observable<T> was expected

从哪里来inferred type is Observable<T?>?我想这与在 Java 中可空类型和不可空类型之间没有区别这一事实有关。

有哪些方法可以解决这个问题?

标签: kotlinextension-function

解决方案


发生这种情况是因为event.value被标记为@Nullable,所以Observable.just(event.value)Observable<T?>。您可以通过将返回类型更改为 来进行编译Observable<T?>,或者在创建 Observable 时使用!!运算符断言event.value不为空(或通过其他方式显式处理空值):

fun <T> Subject<Notification<T>>.fromNotifications(): Observable<T> {
    return compose {
        it.takeUntil { event ->
            !event.isOnNext
        }.flatMap { event ->
            when {
                event.isOnError -> Observable.error(event.error)
                event.isOnNext -> Observable.just(event.value!!)
                else -> Observable.empty()
            }
        }
    }
}

推荐阅读