具有隐式转换的 Scala 映射

Scala map with implicit conversion

我有一个 Scala 案例 class 和一个相应的 Java class。我已经声明了从 Scala class 到 Java class 的隐式转换。现在我有一个 Scala classes 的 Scala 集合,我想将它们转换为 Java classes 的 Scala 集合。隐式转换是否可能?这是我尝试过的,也许是天真的尝试:

case class PositionScala(latitude: Double, longitude: Double)
object PositionScala {
  implicit def toJava(p: PositionScala): Position = new Position(p.latitude, p.longitude) // Position is the Java class
}
...
val p: List[Position] = routeScala.shape.map(p => p) 
                     // routeScala.shape is List[PositionScala]

但编译时出现类型不匹配错误。当然我可以显式调用转换函数,但这违背了使用隐式转换器的目的。有没有办法做我想做的事?

你可以将转换函数 'toJava' 传递给映射函数:

val p: List[Position] = routeScala.shape.map(toJava)

您需要将类型注释放在其他位置:routeScala.shape.map(p => p: Position)。但我想说这比只写 routeScala.shape.map(PositionScala.toJava).

更不清楚

除了@alexey-romanov 的回答之外,我还应该支持 scala 类型解析。

map method 对于 scala 集合有相当复杂的行为。它试图根据可见的 CanBuildFrom 隐式派生结果 collection\element 类型,因此它不能明确说明 map 参数的结果类型应该是什么。因此它不能在这里应用隐式转换。

例如,如果您

val posOpt: Option[PositionScala] = ???

并尝试申请

val posJava: Option[Position] = posOpt.map(p => p) 

它会发现你的转换没有问题。