在Scala中,可以通过例如
创建地图和集合文字val m = Map(1->"a")
参考m
的类型和文字都是Map[Int, String]
。
但是,scala文档显示Map
实际上是一个特征,需要实现抽象成员才能实例化:
scala.collection.Map
,
scala.collection.immutable.Map
,
scala.collection.mutable.Map
所以我的问题是:文字Map
基于什么的实际的具体类?上述同样的问题也适用于Set
。
答案 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
)。