具有隐式转换的 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)
它会发现你的转换没有问题。
我有一个 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)
它会发现你的转换没有问题。