【问题标题】:Pass a sealed class as function argument android传递一个密封类作为函数参数android
【发布时间】:2020-11-24 01:11:54
【问题描述】:

我有一个密封类,它代表我的 API 的改造响应。

sealed class NetworkResponse<out T : Any, out U : Any> {
   
    data class Success<T : Any>(val body: T) : NetworkResponse<T, Nothing>()

    data class ApiError<U : Any>(val body: U, val code: Int) : NetworkResponse<Nothing, U>()

    data class NetworkError(val error: IOException) : NetworkResponse<Nothing, Nothing>()

    data class UnknownError(val error: Throwable?) : NetworkResponse<Nothing, Nothing>()
}

所以现在我想创建一个函数来处理失败请求的所有错误。我只想有一个参数代表 ApiError 或 NetworkError 或 UnknownError

fun networkErrorHanlder(mError: <what_should_i_put_here??>) {
   // check if error is Api or Network or Unknown and do stuff...
}

参数的类型应该是什么?

【问题讨论】:

    标签: android kotlin parameter-passing sealed


    【解决方案1】:

    由于您只关心ApiErrorNetworkErrorUnknownError,它们都派生自NetworkResponse,但不使用第一个泛型类型,您可以使用@ 指定您不关心它987654325@(实际上,根据你想用mError做什么,你也可以用*替换U——下面的代码就是这种情况,但我介绍了U以防万一)。在这种情况下,您应该接受NetworkReponse

    fun <U : Any> networkErrorHanlder(mError: NetworkResponse<*, U>) {
        when(mError) {
            is NetworkResponse.ApiError ->
                print("Api stuff: ${mError.body}")
            is NetworkResponse.NetworkError ->
                print ("Network stuff: ${mError.error}")
            is NetworkResponse.UnknownError ->
                print("Unknown: ${mError.error}")
            else -> print("It must've been a Success...")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 2015-12-04
      • 1970-01-01
      相关资源
      最近更新 更多