scala.collection.mutable 中的 HashMap 是不变的,但 immutable.HashMap 是协变的,为什么?

Jia*_*kun 5 scala

我想用 mutable.HashMap[] 的 val 扩展一个类,如下所示:

class Father
class Son extends Father    

class C1{
  val m = new mutable.HashMap[Int, Father]() 
}

class C2 extends C1{
  override val m = new mutable.HashMap[Int, Son]()
}
Run Code Online (Sandbox Code Playgroud)

并得到一个错误:

错误:(19, 16) 覆盖类型为 scala.collection.mutable.HashMap[Int,ScalaByExample.Father] 的类 C1 中的值 m;值 m 具有不兼容的类型覆盖 val m = new mutable.HashMapInt, Son

我发现它immutable.HashMap是协变的,但它mutable.HashMap是不变的。如果替换mutable.HashMapimmutable.HashMap.

所以我的两个问题是:

  1. 如何使用 mutable.HashMap 使其工作?

  2. 为什么scala的作者要这样设计HashMap?

sep*_*p2k 6

可变映射是不变的,因为否则写入它们将不安全。例如,考虑以下函数:

def f(o: C1) {
    o.m(42) = new Father
}
Run Code Online (Sandbox Code Playgroud)

这种方法的类型非常好。但是如果你传入一个实例C2作为 的值o,它会中断,因为 aMap[Int, Son]不允许包含Father对象。因此,您的定义C2类型错误。