我编写了一个获取特征类型作为输入的方法。
这是特征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)
我该如何解决?感谢。
答案 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
成为您的特质的子类型。