此方法如何返回与声明不同的类型?

时间:2019-02-21 16:43:10

标签: kotlin

我在项目中发现以下代码,该代码用于将可抛出对象转换为自定义异常。

我对它的工作方式感到困惑。

期望的返回类型为: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 :(得分:3)

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都可能以完全相同的方式出错,而不管它产生的无错误值的类型是什么。