我在Scala中有一个Set(我可以选择任何实现,因为我正在创建Set。我正在使用的Java库需要一个java.util.Set [String]。
以下是在Scala中执行此操作的正确方法(使用scala.collection.jcl.HashSet#underlying):
import com.javalibrary.Animals
var classes = new scala.collection.jcl.HashSet[String]
classes += "Amphibian"
classes += "Reptile"
Animals.find(classes.underlying)
它似乎正在工作,但由于我是Scala的新手,我想知道这是否是首选方式(我尝试的任何其他方式都会出现类型不匹配错误):
error: type mismatch;
found : scala.collection.jcl.HashSet[String]
required: java.util.Set[_]
答案 0 :(得分:23)
如果您询问Scala 2.8,那么Java集合的互操作性由scala.collection.JavaConversions
提供。在这种情况下,您需要JavaConversions.asSet(...)(每个方向都有一个,Java - > Scala和Scala - > Java)。
对于Scala 2.7,包装Java集合的每个scala.collection.jcl类都有一个underlying
属性,该属性提供包装的Java集合实例。
答案 1 :(得分:7)
自Scala 2.12.0起scala.collection.JavaConversions
is deprecated:
因此,不推荐使用此API,而应使用JavaConverters。 JavaConverters提供相同的转换,但是通过扩展方法。
自Scala 2.8.1起,您可以use scala.collection.JavaConverters
为此目的:
import scala.collection.JavaConverters._
val javaSet = new java.util.HashSet[String]()
val scalaSet = javaSet.asScala
val javaSetAgain = scalaSet.asJava
答案 2 :(得分:5)
对于2.7.x我高度建议使用:http://github.com/jorgeortiz85/scala-javautils
答案 3 :(得分:0)
在Scala 2.12中,可以使用:scala.collection.JavaConverters.setAsJavaSet(scalaSetInstance)
答案 4 :(得分:0)
请注意,从Scala 2.13
开始,软件包scala.jdk.CollectionConverters
取代了已弃用的软件包scala.collection.JavaConverters/JavaConversions._
:
import scala.jdk.CollectionConverters.Ops._
// val scalaSet: Set[String] = Set("a", "b")
val javaSet = scalaSet.asJava
// javaSet: java.util.Set[String] = [a, b]
javaSet.asScala
// scala.collection.mutable.Set[String] = Set(a, b)