泛型 – RxKotlin:尝试添加自定义错误捕获
发布时间:2020-12-15 04:31:33 所属栏目:Java 来源:网络整理
导读:我正在尝试为RxKotlin编写自己的扩展函数,这将使Observable处理一个特定的错误类型(Throwable子类),其处理程序作为参数传递并且不再发出任何项目. 大理石图将是: --- a --- b --- c --- error : T[ handleErrorT(handler) ]--- a --- b --- c --- finished
我正在尝试为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() } ^^^^^^^^^ 我不喜欢我必须在handleError调用中编写Observable的泛型,我想避免它. 那么,有没有办法避免明确指定第二个通用参数? 我想,一旦我指定了一个通用参数,就没有办法让编译器推断它.但有没有办法重写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() } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |