5

如果我们使用地图,则无需导入不可变地图

scala> val map=Map[String,Int]()
map: scala.collection.immutable.Map[String,Int] = Map()

但是如果我们使用 HashMap,那么不做 import 就会报错。

scala> val a=HashMap[Int,Int]()
 <console>:7: error: not found: value HashMap
       val a=HashMap[Int,Int]()
             ^

但是做import scala.collection.immutable.HashMap,它可以工作。

我也看到它与 Set 和 Hashset..

我注意到一件事 Map 和 Set 是 trait 而 HashSet,HashMap 是类。

那为什么会这样???

编辑

scala.collection 包中也存在类 Stack 和 Queue。那为什么我们需要导入这些类。???

4

4 回答 4

14

编程到接口,而不是实现。Scala 设计人员通过在 Predef 中提供接口的快捷方式来鼓励这一点。

于 2013-02-12T16:55:48.790 回答
3

这是因为Predef是隐式导入的。其中,它包含常见特征的工厂方法,例如Map. HashMap是一个具体的实现,因此如果您将其工厂方法与类型推断一起使用,您会将您的声明与实现紧密耦合。

于 2013-02-12T16:47:59.450 回答
1

在 Scala 中,习惯使用不可变类型,因此默认情况下这些类型可用。如果你想要突变,你必须明确地说出来。

另一个潜在的原因(我只是在猜测)是 HashMap一个 Map,在许多情况下,您并不真正关心 Map 的具体实现,您只需要可以将键与值相关联并且具有相当快的东西查找。所以说 Map("foo" -> "bar") 比 HasArrayMappedTrie("foo" -> "bar") 更抽象。

于 2013-02-12T16:55:01.847 回答
0

它可能与这个集合类的层次结构有关:

在此处输入图像描述

于 2013-02-12T16:56:44.070 回答