传递一个密封的 class 作为函数参数 android

Pass a sealed class as function argument android

我有一个密封的 class 代表我的 API 的 Retrofit Response。

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

参数的类型应该是什么?

由于您只关心 ApiErrorNetworkErrorUnknownError,它们都派生自 NetworkResponse 但不使用第一个泛型类型,您可以指定你不关心它使用 * (实际上,取决于你想用 mError 做什么,你也可以用 * 替换 U - 这就是case 在下面的代码中,但我引入了 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...")
    }
}