Observable.combineLatest更新到RxJava 2.xx后导致错误 – 不能推断类型

最近几天,我正试图将我的项目从RxJava 1.xx迁移到RxJava 2.xx我有这个简单的方法。 如果我使用rxjava 1.xx(rx.Observable)中的Observable,一切都可以。 然而,当我用“新”观察者(io.reactivex.Observable)替换它时,我得到一个错误:“类型推断失败,请明确指定”

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 } } 

你有什么想法我做错了吗? 你能解释一下在RxJava 2中究竟导致这个错误的原因吗?

有人( 这里 )有一个非常相似的问题。 然而,他们在他们的解决方案中使用BiFuntion,它接受两个参数并创建一个结果。 正如你所看到的,我使用更多的参数(3),所以我不能在这里使用Bifunction。

你在使用RxKotlin吗? 如果没有,我会建议尝试,因为它有SAM助手的各种方法,包括combineLatest ,这是受影响的方法之一。 查看他们的文档获取更多信息。

最后,我根据上面给出的建议找到了一个解决方案。 首先应该提到的是,我们不应该返回可空的Observable。 如果我们需要检查传递给combineLatest的值,我们应该先做,而不是在combineLatest中检查它。

当我们删除可空性时,方法如下所示:

 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) }) } 

唯一需要改变的是用Function3替换lambda – 它解决了类型推断的问题。

如果您只有combineLatest的两个值,则可以使用BiFuntion而不是Function3。

如果你需要通过例如6个变量来组合最大可以使用Function6等

查看以下所有变体:

 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) }) }