我正在尝试为 RxKotlin 编写我自己的扩展函数,这将使 Observable 使用作为参数传递的处理程序处理特定的错误类型(Throwable 子类),并且不再发出任何项目。

大理石图将是:

--- a --- b --- c --- error : T

[   handleError<T>(handler)   ]

--- a --- b --- c --- finished
                   |
             handler(error)

我写了以下内容:
public inline fun <reified E : Throwable, R> Observable<R>.handleError(
    crossinline handler: (E) -> Unit
) = onErrorResumeNext f@{
        return@f when (e) {
            is E -> { handler(e); Observable.empty() }
            else -> Observable.error(e)
        }
    }

它工作正常,但要使用它,我必须编写,例如:
 val myObservable: Observable<SomeClass> = ...

 myObservable.handleError<IOException, SomeClass> { it.printStackTrace() }
                                       ^^^^^^^^^

我不喜欢我必须在 Observable 调用中编写 handleError 的泛型,我想避免它。

那么,有没有办法避免显式指定第二个泛型参数?

我想,一旦我指定了通用参数之一,就无法让编译器推断它。但是有没有办法重写 handleErrors 来实现我想要的?

最佳答案

首先,要明确指定 E,您可以使用更详细的 lambda 语法。这看起来像这样:

myObservable.handleError { it : IOException -> it.printStackTrace() }

或者,您可以添加一个额外的参数来帮助编译器推断类型。这可能看起来像这样:
public inline fun <reified E : Throwable, R> Observable<R>.handleError(
    typeHint: (E) -> Unit,
    crossinline handler: (E) -> Unit
) = onErrorResumeNext f@{
        return@f when (e) {
            is E -> { handler(e); Observable.empty() }
            else -> Observable.error(e)
        }
    }

fun <T> of() : (T) -> Unit = {}

用法:
myObservable.handleError(of<IOException>()) { it.printStackTrace() }

关于generics - RxKotlin : trying to add custom errors catching,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34476007/

10-12 18:49