以下是该方法的签名:
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
答案 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,这是编译器自动填充隐式参数的第二种方式,因此它可以工作。