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
是不变的,因此即使 B
是 A
的子类型,也不能将 RDD[B]
放在预期 RDD[A]
的位置。但无论如何这里不是这种情况。
您可以像这样使您的方法通用:
def localizeWithId[A <: Localizable](rdd: RDD[A]): RDD[(BigInt, A)]
要求 A
成为您特征的子类型。
我编写了一个获取特征类型作为输入的方法。
这是特征 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
是不变的,因此即使 B
是 A
的子类型,也不能将 RDD[B]
放在预期 RDD[A]
的位置。但无论如何这里不是这种情况。
您可以像这样使您的方法通用:
def localizeWithId[A <: Localizable](rdd: RDD[A]): RDD[(BigInt, A)]
要求 A
成为您特征的子类型。