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

Scala trait as a method input - type mismatch error

我编写了一个获取特征类型作为输入的方法。 这是特征 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)
   }
}

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

是这样的class:

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

这是调用:

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

我该如何解决?谢谢。

你的问题是这里:

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

你说你希望 RDD[(BigInt, At)] 被 returned,而实际的 return 类型被声明为 RDD[(BigInt,Localizable)]。

RDD 是不变的,因此即使 BA 的子类型,也不能将 RDD[B] 放在预期 RDD[A] 的位置。但无论如何这里不是这种情况。

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

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

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