我在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方法)。

09-08 11:25