簡體   English   中英

Scala錯誤類型推斷

[英]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編譯器說d1d2AnyVal 就目前而言,我使用asInstanceOfd1d2Double但是下次它說

java.lang.ClassCastException:無法將java.lang.Integer強制轉換為java.lang.Double

是Scala編譯器問題還是IntelliJ問題,向我顯示了錯誤的推斷類型。 有什么見解嗎?

對我來說似乎很好:-S類型推斷遠非無所不知。 有時您需要明確指定類型。 以我的經驗,當結果類型可以是任何東西時,尤其如此。 一些嘗試:

  1. 我的首選選項,因為您沒有觸摸按鍵: joinedRDD.mapValues(x => x._1 + x._2)
  2. 添加一些類型信息: val d1: Double = x._2._1 幸運的是,至少編譯器可能更明確。
  3. 分別定義函數,為參數分配類型,並在內部使用: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM