[英]Scala wrong type inference
val finalRDD = joinedRDD.map(x => {
val d1 = x._2._1
val d2 = x._2._2
(x._1, d1 + d2)
})
在上面的代碼中, joinedRDD
具有RDD[(Row, (Double, Double))]
(根據IntelliJ),而Scala編譯器說d1
和d2
是AnyVal
。 就目前而言,我使用asInstanceOf
將d1
和d2
為Double
但是下次它說
java.lang.ClassCastException:無法將java.lang.Integer強制轉換為java.lang.Double
是Scala編譯器問題還是IntelliJ問題,向我顯示了錯誤的推斷類型。 有什么見解嗎?
對我來說似乎很好:-S類型推斷遠非無所不知。 有時您需要明確指定類型。 以我的經驗,當結果類型可以是任何東西時,尤其如此。 一些嘗試:
joinedRDD.mapValues(x => x._1 + x._2)
val d1: Double = x._2._1
。 幸運的是,至少編譯器可能更明確。 map(myFunc)
另外,我已經看到了IntelliJ Scala插件和實際的Scala編譯器之間的一些差異。 鑒於您遇到的錯誤以及AnyVal是Int和Double的公共父類的事實,很有可能您沒有double開頭(並且編譯器正在嘗試查找共享的父)。 通過顯式放置,仔細檢查您是否得到您提到的類型。 您的類型混淆很可能在此行之前發生。
祝好運!
好吧,我在IntelliJ IDEA 14中嘗試過,類型推斷是正確的,將d1和d2識別為Double
(這是預期的)。 但是,我通常會避免使用IDEA的類型識別突出顯示功能,因為很多時候它會發瘋並報告虛假結果。
附帶說明一下,由於您沒有更改RDD的鍵,請考慮使用mapValues
而不是map
(這提供了清晰度和性能,因為它將利用輸入RDD的分區器並在輸出RDD中重用它)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.