只是阅读Scala集合实现并发现了一个微妙的差异:
class HashMap[A, +B]()
class HashMap[A, B]()
请你解释一下为什么不可变的值类型是协变的,而可变的值类型不是?
感谢您的帮助
答案 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
不可变的不会。