Scala错误的类型推断

时间:2015-03-18 13:40:17

标签: scala 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& d2AnyVal。 我暂时投了d1&使用d2 DoubleasInstanceOf,但下次说明

  

java.lang.ClassCastException:java.lang.Integer无法强制转换为   java.lang.Double中

Scala编译器问题或IntelliJ问题是否显示错误的推断类型。任何见解?

2 个答案:

答案 0 :(得分:3)

对我来说似乎很好:-S 类型推断远非无所不知。有时您需要明确指定类型。根据我的经验,当结果类型可以是任何东西时尤其如此。有些事要尝试:

  1. 我首选的选项,因为您没有碰到钥匙:joinedRDD.mapValues(x => x._1 + x._2)
  2. 添加一些类型信息:val d1: Double = x._2._1。幸运的是,至少编译器可能更明确。
  3. 单独定义您的功能,为参数指定类型,并在内部使用:map(myFunc)
  4. 另外,我看到IntelliJ Scala插件和实际的Scala编译器之间存在一些差异。鉴于你得到的错误以及AnyVal是Int和Double的公共父类的事实,你很可能没有双打开始(并且编译器试图找到共享父级)。通过明确说明,仔细检查您是否获得了您提到的类型。您的类型混淆很可能发生在此行之前。

    祝你好运!

答案 1 :(得分:2)

好吧,我在IntelliJ IDEA 14中尝试过并且类型推断是正确的,将d1和d2识别为Double(这是预期的)。尽管如此,我通常会避免IDEA的类型感知突出显示功能,因为很多时候它会变得疯狂并报告假结果。

作为旁注,由于您没有更改RDD的密钥,请考虑使用mapValues代替map(这样可以提供清晰度和性能,因为它可以利用分区程序输入RDD并在输出RDD中重用它。