2017-08-13 87 views
3

使用方法引用時,我有這樣的代碼在Java中推斷類型:科特林無法在可流動

Flowable.just(1,2,3) 
     .flatMap(Flowable::just); 

這個代碼在科特林:

Flowable.just(1,2,3) 
     .flatMap(Flowable::just) 

雖然Java代碼編譯罰款,科特林編譯器說: :「錯誤:(47,30)Kotlin:對於類的一個類型參數Flowable:在io.reactivex中定義的發佈者」

但是,這編寫得很好:

Flowable.just(1,2,3) 
     .flatMap { Flowable.just(it) } 

我在做什麼錯誤或Kotlin如何不能自動推斷Flowable的類型?

+0

來自[Kotlin文檔](https://kotlinlang.org/docs/reference/lambdas.html):「lambda表達式總是被大括號括起來。」 –

回答

2

這不是一個完全的答案,但它太長了評論。

在第一種不編譯的情況下,錯誤與Kotlin沒有選擇正確的Flowable::just方法傳遞給Flowable.flatMap(...)有關。有10個不同的Flowable.just(...)方法定義,其中的差異是參數的數量。

在第二種情況下,您傳遞Flowable.flatMap()一個明確調用Flowable.just()(即一個參數版本)的單參數版本的lambda。

在第一種情況,科特林顯然選擇代替尋找一個由Flowable.flatMap()預期的簽名相匹配的其它十個Flowable::just方法之一(其中有12定義)。相比之下,Java能夠從參數的簽名中推斷出.just()的許多過載中的哪一個可以通過。

這可能是一個Kotlin的缺點,但我想聽聽Kotlin編譯器專家有什麼話要說。