gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:17:36 24 4
gpt4 key购买 nike

我想用 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]()
}

并得到一个错误:

Error:(19, 16) overriding value m in class C1 of type scala.collection.mutable.HashMap[Int,ScalaByExample.Father]; value m has incompatible type override val m = new mutable.HashMapInt, Son



我发现 immutable.HashMap是协变的,但 mutable.HashMap是不变的。如果替换 mutable.HashMap 则有效与 immutable.HashMap .

所以我的两个问题是:
  • 如何使用 mutable.HashMap 使其工作?
  • 为什么scala的作者要这样设计HashMap?
  • 最佳答案

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

    def f(o: C1) {
    o.m(42) = new Father
    }

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

    关于scala - scala.collection.mutable 中的 HashMap 是不变的,但 immutable.HashMap 是协变的,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39835319/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com