Scala trait作为方法输入 - 类型不匹配错误

时间:2015-11-22 09:27:46

标签: scala traits

我编写了一个获取特征类型作为输入的方法。 这是特征Localizable

import com.vividsolutions.jts.geom.Coordinate
trait Localizable {
   val location : Coordinate
}

这是方法:

def localizeWithId(rdd : RDD[Localizable]) : RDD[(BigInt,Localizable)] = {
   return rdd.map { case place =>
     (getIdFromLocation(place.location.x, place.location.y), place)
   }
}

问题在于,当我尝试调用此方法,并发送一个扩展此特征作为参数的案例类时,我收到类型不匹配的错误。

这是案例类:

case class At (
  eventDate : DateTime,
  location : Coordinate
)  extends Localizable

这就是电话:

val ats : RDD[At] = ...
val atsLocalized : RDD[(BigInt, At)] = localizeWithId(ats)

我该如何解决?感谢。

1 个答案:

答案 0 :(得分:4)

你的问题在于:

val atsLocalized : RDD[(BigInt, At)] = localizeWithId(ats)

你说你期望返回RDD[(BigInt, At)],而实际的返回类型被声明为RDD [(BigInt,Localizable)]。

RDD是不变的,因此即使RDD[B]属于RDD[A]的子类型,您也无法将B置于预期A的位置。但无论如何,情况并非如此。

你可以像这样使你的方法通用:

def localizeWithId[A <: Localizable](rdd: RDD[A]): RDD[(BigInt, A)]

要求A成为您的特质的子类型。