在不复制的情况下使可变映射不可变的方法

Ryo*_*Oka 3 scala mutable map immutability

我想将一个可变映射转换为封闭范围内的不可变映射.以下是情况和无意义防御副本的示例代码:

def func(): immutable.Map[String, Int] = {
    val map = mutable.HashMap[String, Int]
    // here goes operations for the map
    return immutable.HashMap ++ map
}
Run Code Online (Sandbox Code Playgroud)

当我写"无意义"时,在这里做防御性复制完全是浪费,因为可变地图实际上是从外部不可变的.如果我们只能从外部看到getter操作,那么性能应该更好.

问题是我真的不知道该怎么做.我试过用匿名的不可变映射实例简单地包装它,但是这个方法def +[B1 >: B](kv: (A, B1))使它变得不可能.

请帮我!

编辑:刚才忘了修复返回类型[Int, Int][String, Int]

Ale*_*nov 6

你可以简单地返回collection.Map,这是一个常见的超类型collection.mutable.Mapcollection.immutable.Map:

def func(): collection.Map[Int, Int] = {
  val map = mutable.HashMap[String, Int]
  // here goes operations for the map
  return map
}
Run Code Online (Sandbox Code Playgroud)

用户可以将其转换为mutable.Map,但他们也可以通过任何解决方案中的反射来获取可变映射,这避免了复制,或者即使在复制时也会改变不可变映射.