2017-03-06 39 views
11

我在這裏有點瘋狂。我正在嘗試創建一個Observable<BigDecimal>擴展函數(針對RxJava 2.x)來發出排放的平均值,但是我收到了Single.zip()函數的編譯錯誤。有沒有人有任何想法我做錯了什麼?我試圖要明確用我所有的類型也和沒有工作...Kotlin和RxJava - 爲什麼我的Single.zip()不能編譯?

import io.reactivex.Observable 
import io.reactivex.Single 
import java.math.BigDecimal 


fun Observable<BigDecimal>.sum() = reduce { total, next -> total + next } 

//compile error 
fun Observable<BigDecimal>.average() = publish().autoConnect(2).let { 
    Single.zip(it.sum().toSingle(), it.count()) { 
     sum, count -> sum/BigDecimal.valueOf(count) 
    } 
} 

enter image description here

+1

指定類型當問錯誤,發佈錯誤。 –

+0

我打算這樣做,但忘記了,稍後會更新以供參考。 – tmn

+0

什麼是錯誤? – voddan

回答

17

類型推斷大多不適用於rxJava2。這實際上不是一個類型推斷問題。 Kotlin通常會生成用kotlin函數類型替換SAM的擴展方法,但由於某些原因,此技術對於重寫的方法不起作用。

更多細節在這裏https://youtrack.jetbrains.com/issue/KT-13609

作爲一個選項,你可以嘗試爲拉姆達參數

fun Observable<BigDecimal>.average() = publish().autoConnect(2).let { 
    Single.zip(it.sum().toSingle(), it.count(), BiFunction { 
     sum: BigDecimal, count: Long -> 
     sum/BigDecimal.valueOf(count) 
    }) 
} 
+1

謝謝,給予Stepan答案,因爲它最大化了推理。 – tmn

+0

如果我在拉鍊中有三個或更多的單打,BiFunction似乎不起作用,因爲它只需要兩個 –

+1

@IoObella,在這種情況下,您需要使用Function3而不是BiFunction – Stepango

5

的類型推斷失敗出於某種原因,必須有類型的,可能是某種程度上的多重組合在此背景下推斷。

您可以用更傳統的(不幸的是更詳細)語法明確指定的類型,就像這樣:

fun Observable<BigDecimal>.average() = publish().autoConnect(2).let { 
    Single.zip(it.sum().toSingle(), it.count(), BiFunction<BigDecimal, Long, BigDecimal> { 
     sum, count -> 
     sum/BigDecimal.valueOf(count) 
    }) 
} 

更新:

我找到了一個工作,而類似的問題,這裏的實際問題是Kotlin無法推斷出您嘗試調用哪個Single.zip重載。從official documentation

如果Java類有多個方法服用功能接口, 你可以選擇你需要使用的適配器功能 ,其轉換拉姆達爲特定類型的SAM打電話的人。那些適配器功能 也由編譯器在需要時生成。

所以事實證明,使用更明確的SAM構造本身就解決了這一點,併爲您提供類型推斷回(基本上,我以前的答案是使用比實際需要更長的語法):

fun Observable<BigDecimal>.average(): Single<BigDecimal> = publish().autoConnect(2).let { 
    Single.zip(it.sum().toSingle(), it.count(), BiFunction { 
     sum, count -> 
     sum/BigDecimal.valueOf(count) 
    }) 
} 
+0

Ew ...好的,我明天就會運行這個工具,如果它能正常工作,請繼續。如果不能推斷這是不幸的。 – tmn

+0

嘿,我剛剛更新了我的答案和更好的解決方案。 – zsmb13