我正在尝试为RxKotlin编写自己的扩展函数,这将使Observable
句柄成为一个特定的错误类型(Throwable
子类),其处理程序作为参数传递并且不再发出任何项目.
大理石图将是:
--- a --- b --- c --- error : T [ handleError(handler) ] --- a --- b --- c --- finished | handler(error)
我写了以下内容:
public inline funObservable .handleError( crossinline handler: (E) -> Unit ) = onErrorResumeNext f@{ return@f when (e) { is E -> { handler(e); Observable.empty() } else -> Observable.error(e) } }
它工作正常,但要使用它我必须写,例如:
val myObservable: Observable= ... myObservable.handleError { it.printStackTrace() } ^^^^^^^^^
我不喜欢我必须Observable
在handleError
电话中写出通用,我想避免它.
那么,有没有办法避免明确指定第二个通用参数?
我想,一旦我指定了一个通用参数,就没有办法让编译器推断它.但有没有办法重写,handleErrors
以实现我想要的?
首先,要明确指定E
,您可以使用更详细的lambda语法.这看起来像这样:
myObservable.handleError { it : IOException -> it.printStackTrace() }
或者,您可以添加一个额外的参数来帮助编译器推断出类型.这看起来像这样:
public inline funObservable .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 of() : (T) -> Unit = {}
用法:
myObservable.handleError(of()) { it.printStackTrace() }