【问题标题】:Scala map with implicit conversion具有隐式转换的 Scala 映射
【发布时间】:2016-02-25 11:36:44
【问题描述】:

我有一个 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]

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

【问题讨论】:

    标签: scala implicit-conversion scala-collections


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您需要将类型注释放在不同的位置:routeScala.shape.map(p => p: Position)。但我想说这比写routeScala.shape.map(PositionScala.toJava) 更清楚。

      【讨论】:

        【解决方案3】:

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

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

        如果你有

        val posOpt: Option[PositionScala] = ???
        

        并尝试申请

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

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

        【讨论】:

        • map 方法链接链接已损坏。
        • @Haspemulator ty,已修复
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-30
        • 2017-08-04
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多