android - Kotlin 中的密封类,不兼容类型错误无法返回父类型
问题描述
我有这个密封的类代表视图状态
sealed class ViewState<out ResultType>(
) {
data class Success<ResultType>(val data: ResultType?) : ViewState<ResultType>()
data class Error(val message: String) : ViewState<Nothing>()
object Loading : ViewState<Nothing>()
}
这里我使用 viewState
fun <T, A> performGetOperation(databaseQuery: () -> LiveData<T>)): LiveData<ViewState<T>> =
liveData(Dispatchers.IO) {
emit(ViewState.Loading)
val cache: LiveData<ViewState.Success<T>> = databaseQuery.invoke()
.map { ViewState.Success<T>(it) }
emitSource(cache)
}
这条线太疯狂了 emitSource(cache) 给我 emitSource(cache)
Required:
LiveData<ViewState<T>>
Found:
LiveData<ViewState.Success<T>>
解决方案
这是一个简单的类型定义问题。您定义cache
为LiveData<ViewState.Success<T>>
which 与 的返回类型不匹配LiveData<ViewState<T>>
。
您必须将类型从 更改val cache: LiveData<ViewState.Success<T>>
为val cache: LiveData<ViewState<T>>
。
这是正确的功能:
fun <T, A> performGetOperation(databaseQuery: () -> LiveData<T>)): LiveData<ViewState<T>> = liveData(Dispatchers.IO) {
emit(ViewState.Loading)
val cache: LiveData<ViewState<T>> = databaseQuery.invoke()
.map { ViewState.Success<T>(it) }
emitSource(cache)
}
推荐阅读
- javascript - 无法加载图像并出现错误 GET 0()
- dapper - Dapper 源代码 - 这会正确处理我的连接吗?
- dotnet-cli - 如何在自定义 dotnet 全局工具中使用现有的 dotnet-cli 命令
- r - 将对象强制为一个新的、特定于包的类
- windows - 列出 2 个目录中的文件并进行比较
- java - AWS Lambda 无法解析压缩罐子
- aspnetboilerplate - 如何更新服务代理 aspnet 样板
- python - 从 python 中的文件中读取错误 UTF 数据列表并将其与一行进行比较
- c# - 将可观察集合中的项目显示为循环链表
- javascript - 如何在 vuejs 中使用 axios 模块化 rest api 调用