Observable.combineLatest 更新到 RxJava 后导致错误 2.x.x。 - 无法推断类型
Observable.combineLatest cause error after updating to RxJava 2.x.x. - cannot infer type
最近几天我试图将我的项目从 RxJava 1.x.x 迁移到 RxJava 2.x.x。我有这个简单的方法。如果我使用来自 rxjava 1.x.x (rx.Observable) 的 Observables,一切都很好。但是,当我用 "new" observables 替换它时(io.reactivex.Observable,我收到一条错误消息:"Type inference failed. Please specify it explicitly"
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? If not, I'd suggest giving that a try as it has SAM helpers for various methods, including combineLatest
, which is one of the methods affected. See their docs 了解更多信息。
最后我根据上面给出的建议找到了解决方案。首先要提到的是我们根本不应该 return nullable 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)
})
}
我必须更改的唯一额外内容是将 lambda 替换为 Function3 - 它解决了类型推断的问题。
如果您只有两个 combineLatest 值,您可以使用 BiFuntion 而不是 Function3。
如果您需要将例如 6 个变量传递给 combineLatest,您可以使用 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)
})
}
我遇到了同样的问题。然后看到Kotlin有一个同名的函数,而且是默认使用的。所以我只是明确地导入了 RxJava 函数,这帮助我摆脱了错误:
import io.reactivex.functions.Function3
最近几天我试图将我的项目从 RxJava 1.x.x 迁移到 RxJava 2.x.x。我有这个简单的方法。如果我使用来自 rxjava 1.x.x (rx.Observable) 的 Observables,一切都很好。但是,当我用 "new" observables 替换它时(io.reactivex.Observable,我收到一条错误消息:"Type inference failed. Please specify it explicitly"
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 中究竟是什么导致了这个错误吗?
有人 (
您是否正在使用 RxKotlin? If not, I'd suggest giving that a try as it has SAM helpers for various methods, including combineLatest
, which is one of the methods affected. See their docs 了解更多信息。
最后我根据上面给出的建议找到了解决方案。首先要提到的是我们根本不应该 return nullable 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)
})
}
我必须更改的唯一额外内容是将 lambda 替换为 Function3 - 它解决了类型推断的问题。
如果您只有两个 combineLatest 值,您可以使用 BiFuntion 而不是 Function3。
如果您需要将例如 6 个变量传递给 combineLatest,您可以使用 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)
})
}
我遇到了同样的问题。然后看到Kotlin有一个同名的函数,而且是默认使用的。所以我只是明确地导入了 RxJava 函数,这帮助我摆脱了错误:
import io.reactivex.functions.Function3