【发布时间】:2012-12-27 10:50:03
【问题描述】:
我有一个函数,它获取一个Seq[_] 作为参数并返回一个不可变的类实例,这个Seq 作为一个 val 成员。如果Seq 是可变的,我显然想创建一个防御性副本以保证我的返回类实例不能被修改。
这种模式的最佳实践是什么?首先我很惊讶不可能重载函数
def fnc(arg: immutable.Seq[_]) = ...
def fnc(arg: mutable.Seq[_]) = ...
我也可以进行模式匹配:
def fnc(arg: Seq[_]) = arg match {
case s: immutable.Seq[_] => { println("immutable"); s}
case s: mutable.Seq[_] => {println("mutable"); List()++s }
case _: ?
}
但我不确定_ 的情况。是否保证arg 是immutable.Seq 或mutable.Seq?我也不知道List()++s 是否是正确的转换方式。我在 SO 上看到了很多帖子,但其中大多数是针对 2.8 或更早版本的。
Scala-Collections 是否足够“智能”,以至于我总是可以(不使用模式匹配)编写 List()++s,如果不可变,我会得到相同的实例,如果可变,我会得到深拷贝?
推荐的方法是什么?
【问题讨论】:
标签: scala immutability scala-collections