首页 文章

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

提问于
浏览
0

我写了一个获取特征类型作为输入的方法 . 这是特质 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 回答

  • 4

    你的问题在于:

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

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

    RDD 是不变的,因此即使 BA 的子类型,也不能将 RDD[B] 放在 RDD[A] 的位置 . 但无论如何,情况并非如此 .

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

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

    要求 A 是你的特质的子类型 .

相关问题