Scala中的类型不匹配

时间:2015-03-10 03:13:15

标签: scala apache-spark rdd

我在rddRDD[(String,Vector)]的代码中有以下代码段,但遗憾的是我的Scala编译器抱怨错误Type mismatch, expected: RDD[(String,Vector)], actual: RDD[(String,Vector)],我调用flagVectorOutlier(rdd, predictedRDD)

def someFunction() {

  testData.foreachRDD( rdd => {
    val vectorsRDD = rdd.map( pair => pair._2 )

    val predictedRDD = model.latestModel().predict( vectorsRDD )

     flagVectorOutlier( rdd, predictedRDD )
  } )

  ssc.start()
  ssc.awaitTermination()
}

def flagVectorOutlier(testVectors: RDD[(String, Vector)], predicts: RDD[Int]): Unit = {

}

考虑到实际和预期的类型是相同的,这里有什么错误的观点?我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:1)

之前我遇到过这种错误。 它发生在我使用的是一个使用java.util.List的java库时,而我自己的代码正在使用scala.collection.immutable.List并将它们混合起来。

您可以轻松地在代码中共存两个具有相同名称的类,但错误消息将不会显示完全限定名称,因此我会得到Type mismatch, expected: List[Integer], actual: List[Integer]这看起来令人费解。解决方案只是完全限定输入参数的类型,或使用typeDef来区分它们。


奖金:我也遇到了与元组类似的问题。例如,当一个方法可以期望元组或直接参数时:

def f(param: (Integer, String))def f(param1: Integer, param2: String)

当使用错误的参数调用方法时(例如,2个参数而不是元组),粗略检查时,错误消息似乎显示两个相同的类型。如果您有多个嵌套元组(因此括号太多但类型相同),情况会变得更糟。