我有以下扩展函数:
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()
}
}
}
}