Как этот метод возвращает тип, отличный от объявленного? - PullRequest
0 голосов
/ 21 февраля 2019

Я нашел следующий код в проекте, и он используется для преобразования throwables в пользовательские исключения.

Я запутался, как это работает.

Ожидаемый тип возвращаемого значения: Single<out Response<T>>

Но тело метода возвращает что-то другое: например, Single<Exception>

Есть ли объяснение?он компилируется и работает нормально!

class ThrowableObservableFunc1<T> : Function1<Throwable, Single<out Response<T>>> {

    override fun invoke(throwable: Throwable): Single<out Response<T>> {
        val clientConnectionException = Exception(throwable.message)

        return when (throwable) {
            is ConnectException, is UnknownHostException, is SSLException ->
                Single.error(clientConnectionException)
            is SocketTimeoutException ->
                Single.error(TimeoutConnectionException(throwable.message))
            else -> Single.error(UnexpectedException(throwable.message))
        }
    }
}

1 Ответ

0 голосов
/ 21 февраля 2019

Single.error не возвращает Single<Exception>, возвращает Single<T> в соответствии со своей подписью:

public static <T> Single<T> error(final Throwable exception)

Поскольку параметр типа T не используется нигде в подписикроме возвращаемого типа (то есть, например, он не принимает T в качестве параметра), он может быть выведен на любой тип, который вам нужен, возвращаемый из этой функции, заключенный в Single.

Еще несколько примеров:

val stringError: Single<String> = Single.error(Exception()) // T inferred to be String
val intError: Single<Int> = Single.error(Exception())       // T inferred to be Int

Или, если вы хотите указать параметр при непосредственном вызове функции (в этом случае вы можете опустить типы для переменных вс левой стороны):

val stringError: Single<String> = Single.error<String>(Exception()) // T specified as String
val intError: Single<Int> = Single.error<Int>(Exception())       // T specified as Int

Все это имеет смысл, поскольку Single любого типа может ошибаться точно так же, независимо от того, какой тип будет иметь значение без ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...