Kotlin和RxJava类型推断失败

6

我正在尝试在Observable上实现retryWhen,当出现超时时使用该方法,但是在IDE Android Studio 3.0中出现了奇怪的错误。

以下是代码:

rxRssiRepository.onRssiUpdate() //returns Observable<RssiEvent>
        .timeout(10, TimeUnit.MILLISECONDS)
        .retryWhen { t: Observable<Throwable> ->
            t.flatMap { error: Throwable ->
                if (error is TimeoutException) {
                    stopLocationUpdates()
                    Log.v("TIMEOUT", "TIMEOUT RSSI EVENTS")
                    Observable.just(Observable.empty())
                } else {
                    Observable.error(error)
                }
            }
        }
        .concatMap { t: RssiEvent ->
            appendRssiEvent(t)
        }
        .publish()

IDE在.flatMap操作符下面用红色下划线标出,提示如下:

类型推断失败:无法推断fun flatMap(mapper: ((t: Throwable) → ObservableSource)!): Observable!中参数R的信息。请显式指定。

'if'操作符同样如此:

控制流表达式的类型推断失败。请显式指定其类型。

.just操作符也是一样的情况:

类型推断失败:无法推断fun just(item: T!): Observable!中参数T的信息。请显式指定。

.empty操作符也是这样的情况:

类型推断失败:无法推断fun empty(): Observable!中参数T的信息。请显式指定。

.error操作符同样如此:

类型推断失败:无法推断fun error(exception: Throwable!): Observable!中参数T的信息。请显式指定。

如何解决这个问题呢?
我的意思是,这段代码在Java中也存在:如何添加超时以检测Observable是否长时间未发出
但是当我将其转换为Kotlin时,就会出现上述情况。
1个回答

9

编译器无法确定您要返回的类型。

在您的情况下,最简单的解决方法是添加一个返回类型。类似这样 Observable.just(Observable.empty<Any>())。现在编译器将能够确定要返回的类型。


谢谢,那个方法可行。但是当超时发生时,它会处理主要的Observable,而我不希望这种情况发生。也许你知道如何防止它发生?我的意思是这个:https://dev59.com/KKDha4cB1Zd3GeqP8QN4 - K.Os
retryWhen 应该重新订阅源可观测对象,即使由于 timeout 原因而导致原始源出错。我不知道该如何解决这个问题。 - jbarat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接