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



我有以下扩展函数:

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?>。 您可以通过将返回类型更改为Observable<T?>,或使用!!运算符断言event.value在创建可观察量时不为 null(或以其他方式显式处理 null 值(来进行此编译:

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

相关内容

最新更新