【问题标题】:Kotlin and RxJava type inference failedKotlin 和 RxJava 类型推断失败
【发布时间】:2018-05-03 14:21:44
【问题描述】:

当发生超时时,我正在尝试在我的 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 运算符并表示:

类型推断失败:没有足够的信息来推断参数 R

有趣的平面地图 ( 映射器:((t:Throwable)→ObservableSource)! ) : 看得见! 请明确说明。

'if' 运算符也是如此:

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

对于运营商.just:

类型推断失败:没有足够的信息来推断参数 T 好玩而已 ( 项目:T! ) : 看得见! 请明确说明。

对于运算符 .empty:

类型推断失败:没有足够的信息推断出参数 T

只是好玩 ( 项目:T! ) : 看得见! 请明确说明。

对于 .error 运算符:

类型推断失败:没有足够的信息推断出参数 T

有趣的错误 ( 例外:可投掷! ) : 看得见! 请明确说明。

如何解决这个问题?

我的意思是,这段代码也在 Java 中: How to add a timeout to detect that an Observable didn't emit for a while

但是当我将它类似地转换为 Kotlin 时,它给了我所描述的情况问题

【问题讨论】:

    标签: kotlin rx-java type-inference rx-java2


    【解决方案1】:

    编译器无法确定你想要返回什么类型。

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

    【讨论】:

    • 谢谢,成功了。但是,当发生此超时时,它会处理我不希望发生的主机 Observable。也许你知道如何预防它?我的意思是:stackoverflow.com/questions/42805481/…
    • retryWhen 应该重新订阅源 observable,是的,由于timeout,原始源以错误结束。我不知道如何绕过它。
    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 2020-12-30
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多