首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带隐式转换的Scala映射

带隐式转换的Scala映射
EN

Stack Overflow用户
提问于 2015-11-23 11:17:24
回答 3查看 1.3K关注 0票数 0

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

代码语言:javascript
运行
复制
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]

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-23 11:52:54

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

票数 4
EN

Stack Overflow用户

发布于 2015-11-23 11:47:37

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

代码语言:javascript
运行
复制
val p: List[Position] = routeScala.shape.map(toJava)
票数 1
EN

Stack Overflow用户

发布于 2015-11-23 13:09:39

此外,对于@alexey的回答,我应该支持scala类型的解析。

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

例如,如果你有

代码语言:javascript
运行
复制
val posOpt: Option[PositionScala] = ???

并试图申请

代码语言:javascript
运行
复制
val posJava: Option[Position] = posOpt.map(p => p) 

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33869764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档