为什么在scala中丢失类型信息?

时间:2015-12-31 06:35:16

标签: scala

以下是该方法的签名:

  def runJob[T, U: ClassTag](rdd: RDD[T], func: Iterator[T] => U): Array[U] = {
    runJob(rdd, func, 0 until rdd.partitions.length)
  }

然后我尝试像这样调用它,但编译失败了。它似乎无法识别int类型。为什么?如果我把它写成第二种方式,它可以工作,非常奇怪,我想念那里的东西吗?

sc.runJob(rdd, (iter:Iterator[Int]) => 1)(0)

<console>:29: error: type mismatch;
 found   : Int(0)
 required: scala.reflect.ClassTag[Int]
         val a=sc.runJob(rdd, (iter:Iterator[Int])=>1)(0)


val a= sc.runJob(rdd, (iter:Iterator[Int]) => 1)
a(0)  // works

1 个答案:

答案 0 :(得分:3)

在template参数中使用TypeTag / ClassTag时,编译器将生成指定typetag的隐式参数。

因此runJob的实际签名应为:

def runJob[T, U: ClassTag](rdd: RDD[T], func: Iterator[T] => U)(implicit ClassTag[U]): Array[U]

编译器将额外的Int参数视为ClassTag,这是编译器自动填充隐式参数的第二种方式,因此它可以工作。