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) }) } 
  • Cómo hacer un event handling errores en rxjava2 en android
  • ¿Cómo escalar dinámicamente el rebote de la stream de emisión de ráfagas?
  • Enfrentando problemas con la implementación de Rx Java con la architecture de flujo en Android kotlin
  • Excepción: blockingConnect no se debe invocar en el subprocess UI a pesar de que subsubscribí en otro subprocess
  • Kotlin y RxJava2 zip operator - Ninguna de las siguientes funciones puede invocarse con los arguments suministrados
  • Llamar a un RxJava Single In Kotlin Lambda
  • RxJava usando Kotlin - cómo sincronizar 2 methods asíncronos, refactorizar desde Java
  • RxJava2 + Retrofit pantalla negra en request de datos
  • ¿Cómo puedo indicar explícitamente la finalización de un Flowable en RxJava?
  • Buscando con RxJava no funciona
  • Encadenando Observables para evitar suscripciones múltiples