通常,如果我想在方法中"承诺"不会更改传递的参数,我会接受它作为一个不可变的集合。然而,我希望允许调用者传递一个可变集合,但仍然在我的方法中承诺无论如何都不会更改它。
我说的是IndexedSeq
大多数(如果不是全部的话(具有可变版本和不可变版本的集合都有一个公共的超类。
在你的IndexedSeq
的情况下,它是特征scala.collection.IndexedSeq
。
def foo(seq: scala.collection.IndexedSeq) = ...
将接受CCD_ 4和CCD_。
scala.collection.IndexedSeq
也没有修改集合的方法。
但是这不是一个保证,因为你仍然可以做这样的事情:
def foo(seq: scala.collection.IndexedSeq) = seq match {
case s: scala.collection.mutable.IndexedSeq => ... //use modifying methods on s
case _ => ... //whatever
}
最后,您仍然可以访问可能更改状态的方法。其优点是,您必须(主动(匹配它,以便访问这些方法。所以只有当你意识到这一点时,你才能做到
承诺?取决于你。。