我具有以下扩展功能:
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
转换为普通Observable
。
我不太明白为什么会出现错误
Type inference failed. Expected type mismatch: inferred type is Observable<T?>! but Observable<T> was expected
inferred type is Observable<T?>
来自哪里?我想这与以下事实有关:在Java中,可空类型和不可空类型之间没有区别。
有什么方法可以解决这个问题?
答案 0 :(得分:2)
之所以会这样,是因为event.value
被标记为@Nullable
,所以Observable.just(event.value)
是Observable<T?>
。您可以通过将返回类型更改为Observable<T?>
或通过使用!!
运算符断言event.value
在创建Observable时不为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()
}
}
}
}