首页 > 解决方案 > 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>>

标签: androidkotlin

解决方案


这是一个简单的类型定义问题。您定义cacheLiveData<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)
}

推荐阅读