带隐式转换的Scala映射

带隐式转换的Scala映射,scala,implicit-conversion,scala-collections,Scala,Implicit Conversion,Scala Collections,我有一个Scala case类和一个相应的Java类。我已经声明了从Scala类到Java类的隐式转换。现在我有了Scala类的Scala集合,我想将它们转换为Java类的Scala集合。隐式转换有可能吗?以下是我尝试过的,也许很天真: case class PositionScala(latitude: Double, longitude: Double) object PositionScala { implicit def toJava(p: PositionScala): Posit

我有一个Scala case类和一个相应的Java类。我已经声明了从Scala类到Java类的隐式转换。现在我有了Scala类的Scala集合,我想将它们转换为Java类的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)

您可以将转换函数“toJava”传递给映射函数:

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

您需要将类型注释放在不同的位置:
routeScala.shape.map(p=>p:Position)
。但是我想说,这比仅仅编写
routeScala.shape.map(PositionScala.toJava)
更不清楚,您需要将类型注释放在不同的位置:
routeScala.shape.map(p=>p:Position)
。但我想说,这比仅仅写
routeScala.shape.map(PositionScala.toJava)
更不清楚。除了@alexey romanov的回答,我应该支持scala类型解析

对于scala,集合具有相当复杂的行为。它试图基于visible
CanBuildFrom
implicit派生结果集合\元素类型,因此无法明确说明
map
参数的结果类型。因此,它不能在这里应用隐式转换

例如,如果你有

val posOpt: Option[PositionScala] = ???
并试图申请

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

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

此外,对于@alexey romanov的回答,我应该支持scala类型的分辨率

对于scala,集合具有相当复杂的行为。它试图基于visible
CanBuildFrom
implicit派生结果集合\元素类型,因此无法明确说明
map
参数的结果类型。因此,它不能在这里应用隐式转换

例如,如果你有

val posOpt: Option[PositionScala] = ???
并试图申请

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

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

map
方法链接已断开。@haspamulator-ty,修复了
map
方法链接已断开。@haspamulator-ty,修复了