如何针对可变和不变的Map编程?

时间:2019-03-13 16:56:45

标签: scala

我想编写一个函数

def doSomething(m: Map[X, Y]): Z = ???

对于某些给定类型X, Y, Z

该函数将对immutable.Mapmutable.Map进行相同的操作。

有什么办法可以写吗?

2 个答案:

答案 0 :(得分:1)

只需声明参数m的类型为collection.Map[X, Y]

这是找出两种类型的最小上限的快速方法:

import collection._
def f(a: mutable.Map[Int, Int], b: immutable.Map[Int, Int]) = List(a, b).head

REPL告诉您返回类型为collection.Map[Int, Int]

答案 1 :(得分:1)

immutable.Mapmutable.Map都扩展了scala.collection.Map

package scala
package collection
trait Map[A, +B] extends Iterable[(A, B)] with GenMap[A, B] with MapLike[A, B, Map[A, B]] {
  def empty: Map[A, B] = Map.empty

  override def seq: Map[A, B] = this
}

从上方可以看到,这是Scala中用于描述地图的通用界面。因此您的功能可能是def doSomething(m: scala.collection.Map[X, Y]): Z = ???

您仍然可以使用大多数Map接口功能,但是,那些在可变和不可变之间不共享的功能将不存在。