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 usa Flowable.generate de Kotlin?
  • Extraño comportamiento de componer y ObservableTransformer en RxJava cuando el genérico pasado se extiende
  • Cómo fusionar 2 flujos separados, almacenar los datos rellenos y subscribirlos después de un time corto
  • Retrofit-Vertx con RxJava2 en Kotlin IllegalStateException message == null
  • Cómo get el último valor emitido de observable
  • ¿Por qué no puedo usar la interfaz como el tipo genérico en este transformador Rx?
  • RxJava zipCon error IDE en Kotlin con Android Studio 3.0
  • RxJava BehaviorSubject no emite el último elemento?
  • ¿Cómo soluciono el error de inferencia de tipo en un Completable transformado utilizando RxLifecycle.bindToLifecycle ()?
  • El suscriptor RxJava2 PublishSubject no puede recibir elementos cuando se le llama desde varios hilos usando SingleScheduler
  • Obtiene N últimos objects emitidos por observables en RxJava2