我在scala中看到了3种地图类型:
scala.collection.Map
scala.collection.immutable.Map
scala.collection.mutable.Map
不变性与可变性非常有意义,并且看起来预先有一个map别名直接到immutable.Map。我不明白为什么有一个scala.collections.Map。
此外,看起来JavaConversions.mapAsJavaMap只接受scala.collections.Map而不是不可变的那个?
答案 0 :(得分:3)
scala doc here提到了
A collection in package scala.collection.immutable is guaranteed to be immutable for everyone.
...
A collection in package scala.collection.mutable is known to have some operations that change the collection in place.
...
A collection in package scala.collection can be either mutable or immutable.
Map
中的 scala.collections.Map
只是一个特征,或者是java中的接口。它为不可变和可变Map提供了通用API。如果不指定,scala默认为不可变实现。
修改强>
In addition it looks like JavaConversions.mapAsJavaMap only accepts a scala.collections.Map and not the immutable one?
不是真的。由于immutable.Map
和mutable.Map
都实现了特征Map
,mapAsJavaMap
实际上并不关心map
的具体实现。
这称为subtyping。正如维基页面所示,期望Bird
的方法并不关心鸟的实例是duck
,ostrich
还是cuckoo
。
答案 1 :(得分:2)
这两种:
scala.collections.immutable.Map
scala.collections.mutable.Map
实现/扩展特征:
scala.collections.Map
您可以将其视为地图的通用界面。
答案 2 :(得分:1)
如果您查看en-US和scala.collection.immutable.Map的文档,您会看到它们都扩展了scala.collection.mutable.Map特征,其中包含地图的常见操作,无论具体实现如何。但是,这只是一个特征,因此您无法启动它。
因此,scala.collection.Map。mapAsJavaMap方法接受地图的不可变和可变变体。