为什么我使用 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()
}
}
}
}
我有以下扩展功能:
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()
}
}
}
}