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