2015-12-26 3 views
3

Я пытаюсь написать свою собственную функцию расширения для RxKotlin, которая сделала бы Observable дескриптором определенного типа ошибки (Throwable подкласс) с обработчиком, который передается как аргумент и не испускает больше Предметы.RxKotlin: пытается добавить пользовательские ошибки ловли

Marble схема будет:

--- 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 [email protected]{ 
     [email protected] 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 для достижения того, чего я хочу?

ответ

7

Прежде всего, чтобы указать E, вы можете использовать более подробный синтаксис лямбда. Это будет выглядеть следующим образом:

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

Alternativly, можно добавить дополнительный параметр, чтобы помочь компилятору вывести тип. Это может выглядеть примерно так:

public inline fun <reified E : Throwable, R> Observable<R>.handleError(
    typeHint: (E) -> Unit, 
    crossinline handler: (E) -> Unit 
) = onErrorResumeNext [email protected]{ 
     [email protected] when (e) { 
      is E -> { handler(e); Observable.empty() } 
      else -> Observable.error(e) 
     } 
    }  

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

Использование:

myObservable.handleError(of<IOException>()) { it.printStackTrace() } 
Смежные вопросы