我想用 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.HashMap为immutable.HashMap.
所以我的两个问题是:
如何使用 mutable.HashMap 使其工作?
为什么scala的作者要这样设计HashMap?
可变映射是不变的,因为否则写入它们将不安全。例如,考虑以下函数:
def f(o: C1) {
o.m(42) = new Father
}
Run Code Online (Sandbox Code Playgroud)
这种方法的类型非常好。但是如果你传入一个实例C2作为 的值o,它会中断,因为 aMap[Int, Son]不允许包含Father对象。因此,您的定义C2类型错误。
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |