在kotlin中使用带有rxjava的密封类时,类型不匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在kotlin中使用带有rxjava的密封类时,类型不匹配相关的知识,希望对你有一定的参考价值。

我有以下代码

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上面的代码有什么问题?

答案

在你的代码中

.map { AddressLoadedState(it) }

给了一个

Observable<AddressLoadedState>

onError函数需要一个Function,它接受异常并返回扩展T的东西。

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

在这种情况下,T是AddressLoadedState。 AddressErrorState不会扩展它,因此编译器会抱怨。

您可以将语句拆分为多行来帮助编译器,但要显示它实际上是一个AddressUiState。或者您也可以在地图函数本身告诉编译器,如下所示:

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

以上是关于在kotlin中使用带有rxjava的密封类时,类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin——最详细的数据类密封类详解

Kotlin常用的 Kotlin 类 ② ( 枚举类 | 枚举类定义函数 | 密封类 )

Kotlin常用的 Kotlin 类 ② ( 枚举类 | 枚举类定义函数 | 密封类 )

Kotlin 延迟初始化和密封类[第一行代码 Kotlin 学习笔记]

kotlin抽象类密封类接口

对比Java学Kotlin密封类