Запечатанный класс в Kotlin, ошибка несовместимых типов не может вернуть родительский тип

#android #kotlin

#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 (кэш) дайте мне emitSource (кэш)

 Required:
LiveData<ViewState<T>>
Found:
LiveData<ViewState.Success<T>>
 

Комментарии:

1. попробуйте вернуться LiveData<ViewState.Success<T>> из функции вместо LiveData<ViewState<T>>

2. испускать (состояние просмотра. Загрузка) будет кричать

3. Не могли бы вы лучше отформатировать свой код. У вас много ненужных пустых строк. Какая строка в вашем коде выдает эту ошибку?

4. @ChristianB эта строка испускает источник (кэш)

Ответ №1:

Это была простая проблема с определением типа. Вы определили cache как LiveData<ViewState.Success<T>> , который не соответствует возвращаемому типу 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)
}
 

Комментарии:

1. LiveData<ViewState . Success<T>> является подтипом LiveData<ViewState<T>> .

2. Я знаю. Я не могу объяснить, почему компилятор не может вывести это. Но изменение этого заставит его работать. Вы можете это подтвердить?

3. «LiveData<ViewState. Success<T>> является подтипом LiveData<ViewState<T>>» Это не так; пожалуйста, смотрите kotlinlang.org/docs/reference/generics.html#variance