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

时间:2016-05-23 00:35:08

标签: scala collections scala-collections

在Scala中,可以通过例如

创建地图和集合文字
val m = Map(1->"a")

参考m的类型和文字都是Map[Int, String]

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

所以我的问题是:文字Map基于什么的实际的具体类?上述同样的问题也适用于Set

1 个答案:

答案 0 :(得分:7)

您可以找到具有getClass的具体运行时类:

scala> println(m.getClass)
class scala.collection.immutable.Map$Map1

所以它是Map1,是在Map伴侣对象中定义的类。但是我们在稍微大一点的地图上尝试相同的事情:

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

这是一个不同的类。让我们尝试一个包含更多元素的地图:

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

这是另一个班级。

简而言之,您从Map(...)toMap获得的具体运行时类是一个实现细节,绝大多数时候您不必担心它(但是当您这样做时) ,您可以查看getClass)。