如何将java.util.HashSet[java.lang.Long]转换为Scala Set[Long]
嗨,我来帮你搞定这个类型转换的小问题~
你现在遇到的核心问题是:Java的java.lang.Long和Scala的Long(本质是scala.Long)虽然都是表示长整型,但属于不同的类型。当你用asScala把Java的HashSet转成Scala的可变集合后,toSet默认会保留原元素类型java.lang.Long,所以没法直接赋值给Set[Long]。
下面给你几个可行的解决方案:
方案1:显式转换元素类型(兼容你当前的JavaConverters导入)
你可以通过map方法把每个java.lang.Long元素转换成Scala的Long,Scala本身提供了这两种类型的隐式转换,所以代码会很简洁:
val a: java.util.HashSet[java.lang.Long] = javaFunction(...) val b: Set[Long] = a.asScala.map(_: Long).toSet
这里map(_: Long)会触发隐式转换,把每个java.lang.Long转成scala.Long,之后再调用toSet就得到你需要的Set[Long]了。
方案2:使用更推荐的新版集合转换器(Scala 2.13+)
注意哦,scala.collection.JavaConverters在Scala 2.13及以后的版本已经被标记为过时了,官方推荐使用scala.jdk.CollectionConverters。用这个的话,你还可以直接给toSet指定目标类型参数,一步到位:
首先替换导入语句:
import scala.jdk.CollectionConverters._
然后转换代码:
val a: java.util.HashSet[java.lang.Long] = javaFunction(...) val b: Set[Long] = a.asScala.toSet[Long]
或者用更简洁的to方法:
val b: Set[Long] = a.asScala.to(Set)
这两种写法都会自动利用隐式转换完成元素类型的转换,同时得到目标集合类型。
为什么原来的代码报错?
简单来说,a.asScala返回的是scala.collection.mutable.Set[java.lang.Long],当你调用无参数的toSet时,Scala会推断元素类型为原集合的java.lang.Long,所以得到的是scala.collection.immutable.Set[java.lang.Long],和你期望的Set[Long]类型不匹配,自然就报错啦。
内容的提问来源于stack exchange,提问作者gknauth

