为什么immutable.Map的值类型是协变的,而可变的,而不是

时间:2018-03-21 17:43:08

标签: scala

只是阅读Scala集合实现并发现了一个微妙的差异:

  • 不可变的HashMap class HashMap[A, +B]()
  • 可变HashMap class HashMap[A, B]()

请你解释一下为什么不可变的值类型是协变的,而可变的值类型不是?

感谢您的帮助

2 个答案:

答案 0 :(得分:5)

如果可变地图是协变的,那么就可以这样做:

val m1: mutable.Map[String, Int] = mutable.Map.empty[String, Int]
val m2: mutable.Map[String, Any] = m1
m2 += ("foo" -> "bar")
m1("foo") // returns "bar" out of a Map[String, Int]???

答案 1 :(得分:2)

可变HashMap有以B为参数的方法,例如def update(key: A, value: B): Unit。存在此类方法意味着B不能协变,或者您可以编写

val map: mutable.HashMap[Int, AnyRef] = mutable.HashMap.empty[Int, String]
map.update(0, new AnyRef) // call update(Int, AnyRef) where (Int, String) is expected

不可变的不会。