【问题标题】:Sealed class in Kotlin, Incompatible types error cannot return parent typeKotlin 中的密封类,不兼容类型错误无法返回父类型
【发布时间】:2021-01-24 19:09:05
【问题描述】:

我有这个密封类代表视图状态

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>>

【问题讨论】:

  • 尝试从函数返回 LiveData&lt;ViewState.Success&lt;T&gt;&gt; 而不是 LiveData&lt;ViewState&lt;T&gt;&gt;
  • emit(ViewState.Loading) 会喊
  • 您能否更好地格式化您的代码。你有很多不必要的空行。代码中的哪一行给出了这个错误?
  • @ChristianB 这一行 emitSource(cache)

标签: android kotlin


【解决方案1】:

这是一个简单的类型定义问题。 您将cache 定义为LiveData&lt;ViewState.Success&lt;T&gt;&gt;,它与LiveData&lt;ViewState&lt;T&gt;&gt; 的返回类型不匹配。

您必须将类型从 val cache: LiveData&lt;ViewState.Success&lt;T&gt;&gt; 更改为 val cache: LiveData&lt;ViewState&lt;T&gt;&gt;

下面是正确的函数:

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)
}

【讨论】:

  • LiveData> 是 LiveData> 的子类型。
  • 我知道。我无法解释为什么编译器无法推断这一点。但是改变它会使它起作用。你能确认一下吗?
  • "LiveData> 是 LiveData> 的子类型" 它不是;请看kotlinlang.org/docs/reference/generics.html#variance
猜你喜欢
  • 2018-06-15
  • 2021-04-15
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2022-12-15
相关资源
最近更新 更多