我有一个函数,它以 aSeq[_]
作为参数并返回一个不可变的类实例,并将 thisSeq
作为 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
,如果不可变,我得到相同的实例,如果可变,我得到一个深拷贝?
推荐的方法是什么?