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 señalar un observable para producir más datos
  • Cómo controlar el flujo sin .flatMap, que rompe una stream reactiva que impide que operadores como distinctUntilChanged trabajen en toda la secuencia
  • ¿Comportamiento incorrecto de Maybe <List <T >> en Room?
  • EXCEPCIÓN FATAL: RxCachedThreadScheduler-1 cuando el gatillo se deshace. ¿Por qué?
  • Prueba RxJava2 Flowable Query Room
  • Manejo de errores de suscripción anidada RX2.0
  • Completable.andThen resultados en "other is null"
  • ¿Cómo crear un intervalo infinito observable que emitirá un nuevo object cada intervalo de time?
  • Extraño comportamiento de componer y ObservableTransformer en RxJava cuando el genérico pasado se extiende
  • Cómo retrasar onError () en RxJava 2 y Android?
  • RxJava BehaviorSubject no emite el último elemento?