我在使用 Scala 的 SortedMap[A,B] 时遇到了一些未经授权的奇怪现象。如果我声明对 SortedMap[A,B] "a" 的引用是 Map[A,B] 类型,那么对 "a" 的映射操作将产生一个未排序的映射实现。
例子:
import scala.collection.immutable._
object Test extends App {
val a: Map[String, String] = SortedMap[String, String]("a" -> "s", "b" -> "t", "c" -> "u", "d" -> "v", "e" -> "w", "f" -> "x")
println(a.getClass+": "+a)
val b = a map {x => x} // identity
println(b.getClass+": "+b)
}
上面的输出是:
class scala.collection.immutable.TreeMap: Map(a -> s, b -> t, c -> u, d -> v, e -> w, f -> x)
class scala.collection.immutable.HashMap$ HashTrieMap: Map(e -> w, f -> x, a -> s, b -> t, c -> u, d -> v)
身份转换前后键/值对的顺序不一样。
奇怪的是,从“a”中删除类型声明会使这个问题消失。这在一个玩具示例中很好,但会使 SortedMap[A,B] 无法用于传递给需要 Map[A,B] 参数的方法。
一般来说,我希望诸如“map”和“filter”之类的高阶函数不会改变它们所应用的集合的基本属性。
有谁知道为什么“地图”会这样?