kotlin - 为什么我得到“推断类型是 Observable!但可观察预期”具有可观察的 Kotlin 扩展功能?
问题描述
我有以下扩展功能:
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
值的 a 转换为普通的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?>
,或者在创建 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()
}
}
}
}
推荐阅读
- python - 程序如何在 Python 中同时执行两个动作?
- python - 优化中的多个目标
- tensorflow - 如何解释卷积神经网络中的梯度范数?
- nginx - Kubernetes 中带有 nginx 入口控制器的 Kibana
- mysql - 将外键添加到现有表
- javascript - 在 Chart.js 中为单个数据值在图例中显示多个标签
- nginx - 在 stderr 中发送的 FastCGI:“PHP 消息:PHP 通知:未定义索引:”
- reactjs - 尝试将 React 应用程序部署到 Heroku 时出错
- c# - 从 MVC .net 中的 XML URL 文件获取节点
- javascript - Javascript - 从 DOM 中检索数据