27

我在 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[_]
4

5 回答 5

24

如果您询问 Scala 2.8,Java 集合互操作性由scala.collection.JavaConversions. 在这种情况下,您需要 JavaConversions.asSet(...) (每个方向都有一个,Java -> Scala 和 Scala -> Java)。

对于 Scala 2.7,包装 Java 集合的每个 scala.collection.jcl 类都有一个underlying属性,该属性提供包装的 Java 集合实例。

于 2010-02-10T02:27:13.830 回答
10

由于 Scala 2.12.0scala.collection.JavaConversions 已被弃用

因此,此 API 已被弃用,而应使用 JavaConverters。JavaConverters 提供相同的转换,但通过扩展方法。

从 Scala 2.8.1 开始,您可以用于 scala.collection.JavaConverters此目的:

import scala.collection.JavaConverters._
val javaSet = new java.util.HashSet[String]()
val scalaSet = javaSet.asScala
val javaSetAgain = scalaSet.asJava
于 2016-11-27T13:17:54.917 回答
5

对于 2.7.x,我强烈建议使用:http: //github.com/jorgeortiz85/scala-javautils

于 2010-02-10T10:18:18.593 回答
2

在 Scala 2.12 中,可以使用:scala.collection.JavaConverters.setAsJavaSet(scalaSetInstance)

于 2017-08-28T11:58:48.840 回答
2

请注意,开始Scala 2.13时,包scala.jdk.CollectionConverters替换不推荐使用的包scala.collection.JavaConverters/JavaConversions._

import scala.jdk.CollectionConverters._

// 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)
于 2019-03-29T21:14:57.473 回答