Kotlin和RxJava类型推断失败

时间:2017-11-20 11:18:06

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

我正在尝试在我的Observable上实现重试时有一个时间点,但我在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.      

有趣的flatMap   (   mapper :((t:Throwable)→ObservableSource)!   )   :可观察!   请明确说明。

'if'运算符相同:

  

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

对于运营商.just:

  

类型推断失败:没有足够的信息来推断参数T in   好玩的   (   item:T!   )   :可观察!   请明确说明。

对于运营商.empty:

  

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

中的参数T.      只是好玩   (   item:T!   )   :可观察!   请明确说明。

对于.error运算符:

  

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

中的参数T.      

有趣的错误   (   例外:可以扔掉!   )   :可观察!   请明确说明。

如何解决这个问题?

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

但是当我把它转换成Kotlin时,它给了我描述的情况问题

1 个答案:

答案 0 :(得分:5)

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

您的案例中最简单的修复方法是添加返回类型的类型。这样的事情Observable.just(Observable.empty<Any>())。现在编译器将能够确定要返回的类型。