Observable.combineLa causa de error más reciente después de actualizar a RxJava 2.xx – no se puede inferir el tipo

Los últimos días estoy intentando migrar mi proyecto de RxJava 1.xx a RxJava 2.xx. Tengo este sencillo método. Todo está bien si uso los Observables de rxjava 1.xx (rx.Observable). Sin embargo, cuando lo reemplacé con "observables" nuevos (io.reactivex.Observable), aparece un error que dice: "Falló la inferencia de tipo. Especifíquelo explícitamente".

fun <T1, T2, T3, R> combineLatestValue3Nullable(observable1: Observable<T1?>, observable2: Observable<T2?>, observable3: Observable<T3?>, merge: (T1, T2, T3?) -> R): Observable<R?> { return Observable.combineLatest(observable1, observable2, observable3) { value1, value2, value3 -> var result: R? = null if (value1 != null && value2 != null) { result = merge(value1, value2, value3) } result } } 

¿Tienes alguna idea de lo que hago mal? ¿Puede explicar qué causa exactamente este error en RxJava 2?

Alguien ( aquí ) tuvo un problema muy similar a esto. Sin embargo, están utilizando BiFuntion en su solución, que acepta dos arguments y crea un resultado. Como puede ver, uso más arguments (3), así que no puedo usar Bifunction aquí.

¿Estás usando RxKotlin ? De lo contrario, sugeriría intentarlo ya que tiene ayudantes SAM para varios methods, incluido combineLatest , que es uno de los methods afectados. Vea sus documentos para más información.

Al final encontré una solución basada en los consejos dados anteriormente. Lo primero que debe mencionarse es el hecho de que no deberíamos devolver ningún Observable nulo. Si necesitamos verificar los valores pasados ​​a combineLatest, deberíamos hacerlo antes en lugar de verificarlo dentro de combinelatest.

Cuando eliminamos la capacidad de anulación, el método se ve así:

 fun <T1, T2, T3, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, merge: (T1, T2, T3) -> R): Observable<R> { return Observable.combineLatest(observable1, observable2, observable3, Function3 { value1, value2, value3 -> merge(value1, value2, value3) }) } 

La única cosa adicional que tuve que cambiar es replace lambda con Function3 – resuelve el problema de la inferencia de tipo.

Si solo tiene dos valores para combineLatest, puede usar BiFuntion en lugar de Function3.

Si necesita pasar, por ejemplo, 6 variables para combinar Latest, puede usar Function6, etc.

Ver todas las variantes a continuación:

 fun <T1, T2, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, merge: (T1, T2) -> R): Observable<R> { return Observable.combineLatest(observable1, observable2, BiFunction { value1, value2 -> merge(value1, value2) }) } fun <T1, T2, T3, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, merge: (T1, T2, T3) -> R): Observable<R> { return Observable.combineLatest(observable1, observable2, observable3, Function3 { value1, value2, value3 -> merge(value1, value2, value3) }) } fun <T1, T2, T3, T4, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, observable4: Observable<T4>, merge: (T1, T2, T3, T4) -> R): Observable<R> { return Observable.combineLatest(observable1, observable2, observable3, observable4, Function4 { value1, value2, value3, value4 -> merge(value1, value2, value3, value4) }) } fun <T1, T2, T3, T4, T5, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, observable4: Observable<T4>, observable5: Observable<T5>, merge: (T1, T2, T3, T4, T5) -> R): Observable<R> { return Observable.combineLatest(observable1, observable2, observable3, observable4, observable5, Function5 { value1, value2, value3, value4, value5 -> merge(value1, value2, value3, value4, value5) }) } fun <T1, T2, T3, T4, T5, T6, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, observable4: Observable<T4>, observable5: Observable<T5>, observable6: Observable<T6>, merge: (T1, T2, T3, T4, T5, T6) -> R): Observable<R> { return Observable.combineLatest(observable1, observable2, observable3, observable4, observable5, observable6, Function6 { value1, value2, value3, value4, value5, value6 -> merge(value1, value2, value3, value4, value5, value6) }) } fun <T1, T2, T3, T4, T5, T6, T7, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, observable4: Observable<T4>, observable5: Observable<T5>, observable6: Observable<T6>, observable7: Observable<T7>, merge: (T1, T2, T3, T4, T5, T6, T7) -> R): Observable<R> { return Observable.combineLatest(observable1, observable2, observable3, observable4, observable5, observable6, observable7, Function7 { value1, value2, value3, value4, value5, value6, value7 -> merge(value1, value2, value3, value4, value5, value6, value7) }) } fun <T1, T2, T3, T4, T5, T6, T7, T8, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, observable4: Observable<T4>, observable5: Observable<T5>, observable6: Observable<T6>, observable7: Observable<T7>, observable8: Observable<T8>, merge: (T1, T2, T3, T4, T5, T6, T7, T8) -> R): Observable<R> { return Observable.combineLatest(observable1, observable2, observable3, observable4, observable5, observable6, observable7, observable8, Function8 { value1, value2, value3, value4, value5, value6, value7, value8 -> merge(value1, value2, value3, value4, value5, value6, value7, value8) }) } 
  • RxJava2 Tal vez devuelva Observable vacío si no hay elemento
  • ¿Cómo crear un intervalo infinito observable que emitirá un nuevo object cada intervalo de time?
  • Cómo upload el valor de retorno de un constructor
  • Mockito never () no funciona con andThen rxjava2
  • Fusionar observables dependientes
  • ¿Cómo puedo indicar explícitamente la finalización de un Flowable en RxJava?
  • RxJava usando Kotlin - cómo sincronizar 2 methods asíncronos, refactorizar desde Java
  • RxJava BehaviorSubject no emite el último elemento?
  • RxJava2 cómo separar diferentes implementaciones de emisor observable
  • Prueba RxJava2 Flowable Query Room
  • Llamar a un RxJava Single In Kotlin Lambda