为什么我使用 Observable Kotlin 扩展函数得到 "inferred type is Observable<T?>! but Observable<T> was expected"?

Why am I getting "inferred type is Observable<T?>! but Observable<T> was expected" with Observable Kotlin extension function?

我有以下扩展功能:

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()
            }
        }
    }
}

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

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

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

inferred type is Observable<T?>从何而来?我想这与以下事实有关:在 Java 中,可空类型和不可空类型之间没有区别。

有什么方法可以解决这个问题?

这是因为 event.value 被标记为 @Nullable,所以 Observable.just(event.value) 是一个 Observable<T?>。您可以通过将 return 类型更改为 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()
            }
        }
    }
}