Получение несоответствия типов при использовании закрытого класса с rxjava в kotlin - PullRequest
0 голосов
/ 26 июня 2018

У меня следующий код

sealed class AddressUiState
object AddressLoading : AddressUiState()
class AddressLoadedState(val addressResponse: AddressBookResponse) : AddressUiState()
class AddressErrorState(val error: Throwable) : AddressUiState()

, и у меня ViewModel, как показано ниже

class AddressViewModel constructor(private val service: SingleProfileService) : ViewModel() {

    fun getDisplayableAddressState(id: String): Observable<out AddressUiState> {
        return service.getAddresses(id)
                .map { AddressLoadedState(it) }
                .startWith(AddressLoading)
                .onErrorReturn { AddressErrorState(it) }
                .subscribeOn(Schedulers.io())

    }
}

Я вижу ошибку компиляции и onErrorReturn с ошибкой Несоответствие типов.Обязательно: AddressLoadedState!Найдено: AddressErrorState Что не так с приведенным выше кодом?

1 Ответ

0 голосов
/ 26 июня 2018

в вашем коде

.map { AddressLoadedState(it) }

дает

Observable<AddressLoadedState>

Функция onError ожидает функцию, которая принимает исключение и возвращает что-то, расширяющее T.

Observable<T> onErrorReturn(Func1<? super Throwable, ? extends T> resumeFunction)

В этом случае T является AddressLoadedState.AddressErrorState не расширяет это, поэтому компилятор будет жаловаться.

Вы можете разбить операторы на более чем одну строку, чтобы помочь компилятору, чтобы показать, что T на самом деле является AddressUiState.Или вы также можете указать компилятору на функцию map, например:

    return service.getAddresses(id)
            .map<AddressUiState> { AddressLoadedState(it) }
            .startWith(AddressLoading)
            .onErrorReturn { AddressErrorState }
            .subscribeOn(Schedulers.io())
...