为什么我不能添加到一个scala.collection.Map
?如果没有此功能,这似乎trait
毫无用处。
难道他们不能重写++
in 方法Iterable
并将返回类型减少到 aMap
吗?
PS我并不是说它应该是mutable,只是它应该能够返回一个Map
带有添加映射(或映射)的 new ,与immutable.Map
.
为什么我不能添加到一个scala.collection.Map
?如果没有此功能,这似乎trait
毫无用处。
难道他们不能重写++
in 方法Iterable
并将返回类型减少到 aMap
吗?
PS我并不是说它应该是mutable,只是它应该能够返回一个Map
带有添加映射(或映射)的 new ,与immutable.Map
.
我将在下面留下原始答案,尽管它非常不正确,因为我没有正确理解这个问题。
Scala 目前的集合库几乎强制执行可变/不可变的不同添加方法,可能是希望在源代码中明确使用哪种类型的集合。如前所述,这正在 2.8 中进行修订,并且该前提正在消失。
在这种情况下,抽象类不提供您正在考虑的方法,因为它们可能存在于不可变但不存在于可变,反之亦然。或者它们可能具有相同的名称,但实现不同。
因此,不可能在基类中提供它们。
但是,此外,请注意,通过这种方式,如果您收到一个 scala.collection.map,当您收到一个不可变对象时,您不能通过将其视为可变对象来搞砸它,反之亦然。
而且,现在,对于错误的答案。:)
你可以(不,你不能——下面的代码使用 scala.collection.imutable.Map)。
scala> val x = Map(1 -> 'a', 2 -> 'b')
x: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b)
scala> x ++ Map(3 -> 'c')
res5: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c)
scala> var y = x
y: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b)
scala> y += (3 -> 'c')
scala> y
res7: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c)
scala> x + (3 -> 'c')
res8: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c)
Scala 集合库目前存在相当大的缺陷。2.8(将在一个月左右发布)有一个完全改进的集合库,我相信它具有您正在寻找的行为。
我的猜测是:如果你有一些集合并且需要为其他人提供一个只读的 Map 外观,那么这个 trait 就适合这个工作。如果您在其中添加添加内容,则不会是正交设计,因为那时需要只读地图界面。另一方面,如果需要泛型接口中的 ++ 操作,则它不适用于可变和不可变实现。例如,如果可变集合在添加时返回 self ,那么仅通过查看界面就不会很明显会发生什么。