Kotlin通配符方法

时间:2015-12-30 22:11:15

标签: rx-java kotlin

我在使用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)显示错误:

  

类型不匹配:期待在Throwable中找到Throwable

    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并返回预期值吗?

1 个答案:

答案 0 :(得分:2)

找到解决方案:

it.cast(Throwable::class.java).zipWith

或者这个:

(observable as Observable<Throwable>).zipWith

使用Throwable解决方案进行投射,我希望Kotlin有另一种方法(不依赖于Observable.cast方法)。