我想将一个可变映射转换为封闭范围内的不可变映射。以下是情况和无意义防御副本的示例代码:
def func(): immutable.Map[String, Int] = {
val map = mutable.HashMap[String, Int]
// here goes operations for the map
return immutable.HashMap ++ map
}
正如我写的那样"废话",在这里做防御性复制完全是浪费,因为可变地图实际上是从外部不可变的。如果我们只能从外部看到getter操作,那么性能应该更好。
问题在于我真的不知道该怎么做。我尝试用匿名不可变映射实例简单地包装它,但方法def +[B1 >: B](kv: (A, B1))
使它变得不可能。
请帮帮我!
编辑:忘了将返回的类型[Int, Int]
修复为[String, Int]
答案 0 :(得分:6)
您只需返回collection.Map
,这是collection.mutable.Map
和collection.immutable.Map
的常见超类型:
def func(): collection.Map[Int, Int] = {
val map = mutable.HashMap[String, Int]
// here goes operations for the map
return map
}
用户可以将其转换为mutable.Map
,但他们也可以通过任何解决方案中的反射来获取可变映射,避免复制,或者即使在复制时也会改变不可变映射。