【问题标题】:Scala's implicit conversion isn't working on java.util.ListScala 的隐式转换不适用于 java.util.List
【发布时间】:2018-08-24 08:24:07
【问题描述】:

我是 scala 新人,我正在尝试在我的 java 项目中使用 scala。我想在 scala 代码中将java.util.List 视为Array,并且我知道一些隐式转换,并认为它可能对我有所帮助。但是在定义了将java.util.ArrayList[String] 转换为Array[String] 的隐式转换之后。我的代码仍然不起作用。这是我的代码,谁能给我一些建议。

    implicit def collection2Arr(collection:java.util.ArrayList[String]) :Array[String] = {
            return collection.toArray(new Array[String](collection.size()))
    }

    val arrayList = new util.ArrayList[String]()
    arrayList.map(x=>x+"1")

【问题讨论】:

  • 隐式转换已生效,java.util.ArrayList[String] 已转换为 Array[String],但 map 是 trait TraversableLike 中的一个方法。看来转换后的Array[String]不能转换成TraversableLike,如果要使用TraversableLike中的方法怎么办?

标签: java scala


【解决方案1】:

为了使您的示例正常工作,Scala 必须链接 2 个隐式转换(一个 j.u.ArrayListscala.Array,另一个从 scala.ArrayArrayOps。一般来说,这种技术会带来指数级的检查可能性(遍历 所有 可能的隐式转换链)并且会使开发人员无法判断哪个有效。因此,Scala 仅检查 1 个可能的转换,并且由于 @ 中没有 map 987654326@ 或 Array 中的失败。

回答你的问题,你应该使用JavaConverters

scala> val l = new ArrayList[String]()
l: java.util.ArrayList[String] = []

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> l.asScala
res0: scala.collection.mutable.Buffer[String] = Buffer()

scala> l.asScala.toArray
res1: Array[String] = Array()

scala> l.asScala.toArray.map(x => x + "1")
res2: Array[String] = Array()

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 2012-02-08
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多