Scala的隐式转换不适用于java.util.List

时间:2018-08-24 08:24:07

标签: java scala

我是一个新的Scala,并且我试图在我的Java项目中使用Scala。我想在Scala代码中将java.util.ListArray一样对待,并且我知道隐式转换有点过头,并且认为这可能对我有帮助。但是在将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")

1 个答案:

答案 0 :(得分:4)

为使您的示例正常工作,Scala必须链接2个隐式转换(一个j.u.ArrayListscala.Array,另一个从scala.ArrayArrayOps。)将带来指数级的检查可能性(遍历所有所有个隐式转换的可能链),并使开发人员从字面上无法分辨哪一个可行,因此,Scala仅检查1个可能的转换,并且,因为在mapArrayList中都没有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()