我有一个Scala案例类和一个相应的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]但它不使用类型错配错误进行编译。当然,我可以显式调用转换函数,但它违背了使用隐式转换器的目的。有办法做我想做的事吗?
发布于 2015-11-23 11:52:54
您需要将类型注释放在不同的位置:routeScala.shape.map(p => p: Position)。但我要说的是,这一点比仅仅写routeScala.shape.map(PositionScala.toJava)还不清楚。
发布于 2015-11-23 11:47:37
您可以将转换函数'toJava‘传递给映射函数:
val p: List[Position] = routeScala.shape.map(toJava)发布于 2015-11-23 13:09:39
此外,对于@alexey的回答,我应该支持scala类型的解析。
scala集合的 method具有相当复杂的行为。它试图基于可见的CanBuildFrom隐式导出结果集合\元素类型,因此不能明确说明map参数的结果类型应该是什么。因此,它不能在这里应用隐式转换。
例如,如果你有
val posOpt: Option[PositionScala] = ???并试图申请
val posJava: Option[Position] = posOpt.map(p => p) 它会发现你的转变没有问题。
https://stackoverflow.com/questions/33869764
复制相似问题