Map 和 Set 的实际 class(不是抽象也不是特征)是什么?

What is the actual class (not abstract and not trait) for Map and Set?

在 Scala 中,可以通过

等方式创建 map 和 set 文字
val m = Map(1->"a")

引用的类型m和字面量都是Map[Int, String].

然而,scala文档显示Map实际上是一个特征,需要实现抽象成员才能实例化: scala.collection.Map, scala.collection.immutable.Map, scala.collection.mutable.Map

所以我的问题是:文字 Map 所基于的实际、具体 class 是什么?上面的相同问题也适用于 Set

您可以通过 getClass:

找到具体的运行时间 class
scala> println(m.getClass)
class scala.collection.immutable.Map$Map1

所以它是 Map1,一个在 Map 伴生对象中定义的 class。但是然后我们在稍微大一点的地图上尝试同样的事情:

scala> val m2 = Map(1 -> "a", 2 -> "b")
m2: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)

scala> println(m2.getClass)
class scala.collection.immutable.Map$Map2

这是不同的class。让我们尝试使用更多元素的地图:

scala> println((0 to 10).map(i => i -> i.toString).toMap.getClass)
class scala.collection.immutable.HashMap$HashTrieMap

这是另一个 class。

简而言之,您从 Map(...)toMap 获得的具体运行时间 class 是一个实现细节,绝大多数情况下您无需担心它(但是当你这样做时,你可以检查 getClass)。