我在项目中发现以下代码,该代码用于将可抛出对象转换为自定义异常。
我对它的工作方式感到困惑。
期望的返回类型为: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))
}
}
}
答案 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
都可能以完全相同的方式出错,而不管它产生的无错误值的类型是什么。