是否有一种通用的方法将Scala中的一些可变集合转换为其不可变对应集合(假设它有一个)?
用例示例......
private[this] val _collection: mutable.TreeSet[A]
def collection: immutable.TreeSet[A] = {
// convert mutable _collection to immutable version for public consumption
}
我尝试了以下内容......
def collection: immutable.TreeSet[A] = {
_collection.to[immutable.TreeSet[A]]
}
...但是这导致编译时出现了一个神秘的错误消息......
scala.collection.immutable.TreeSet[A] takes no type parameters, expected: one
......有什么想法吗?
答案 0 :(得分:2)
我怀疑必须从头开始创建immutable.TreeSet
:
trait Aaa[A] {
val _collection: mutable.TreeSet[A]
def collection: immutable.TreeSet[A] = {
immutable.TreeSet.empty[A] ++ _collection
}
}
编辑以跟进评论
来自immutable.TreeSet
的scala-2.11.7源代码:
import scala.collection.immutable.{RedBlackTree => RB}
private def newSet(t: RB.Tree[A, Unit]) = new TreeSet[A](t)
不幸的是newSet
是私有的,来自mutable.TreeSet
:
class TreeSet[A] private (treeRef: ObjectRef[RB.Tree[A, Null]], from: Option[A], until: Option[A])
构造函数也是私有的......
答案 1 :(得分:0)
如果您不关心最终得到的特定Set
实施方式,那么前进的方法就是val immutableSet = mutableSet.toSet
如果你特意想要不可变的TreeSet
,而不仅仅是Set
,你将需要使用breakOut:
val immutableSet: immutable.TreeSet[T] = mutableSet.map(identity)(collection.breakOut)