我在RxJava中使用retryWhen
函数遇到一些问题。
当我创建一个要通过retryWhen
传递给Observable
的函数时,无法调用zipWith
函数。看来Kotlin期待这里无法投下的东西。
在此示例中,it.zipWith
不起作用(某些其他方法可用,但该方法不可用):
val retryFunc = Func1<Observable<out Throwable>, Observable<Any>> {
// zipWith is not possible to call
it.zipWith<Int, Any>(Observable.range(1, 3), Func2<Throwable, Int, Any> { throwable, integer ->
if (integer > 2) {
return@Func2 Observable.error<Any>(Exception())
}
Observable.timer(1, TimeUnit.SECONDS)
})
}
Observable.just("1", "2", "3").retryWhen(retryFunc)
如果我将传入参数更改为
Func1<Observable<in Throwable> ...
,则in
关键字可以使用zipWith
函数。但是更改之后,调用retryWhen(retryFunc)
会显示错误: val retryFunc = Func1<Observable<in Throwable>, Observable<Any>> {
it.zipWith<Int, Any>(Observable.range(1, 3), Func2<Throwable, Int, Any> { throwable, integer ->
if (integer > 2) {
return@Func2 Observable.error<Any>(Exception())
}
Observable.timer(1, TimeUnit.SECONDS)
})
}
Observable.just("1", "2", "3").retryWhen(retryFunc) // type mismatch here, expected out, found in
有谁知道我如何在Kotlin中接收和生产相同类型的东西?
能够创建
zipWith
并返回期望值吗? 最佳答案
找到了解决方案:it.cast(Throwable::class.java).zipWith
或者这个:(observable as Observable<Throwable>).zipWith
使用Throwable
进行转换可以解决问题,我希望Kotlin有另一种方式(不取决于Observable.cast
方法)。