Передайте запечатанный класс в качестве аргумента функции android - PullRequest
0 голосов
/ 04 августа 2020

У меня есть запечатанный класс, который представляет ответ на модернизацию моего 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...
}

Каким должен быть тип аргумента?

1 Ответ

2 голосов
/ 04 августа 2020

Поскольку вас интересуют только ApiError, NetworkError и UnknownError, которые все являются производными от NetworkResponse, но не используют первый тип generi c, вы можете указать, что вас не волнуют он использует * (на самом деле, в зависимости от того, что вы хотите сделать с 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...")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...