Scala:初始化已被别名化的空地图吗?

时间:2018-08-21 21:57:41

标签: scala types scala-collections type-alias

通常,我一直以这种方式声明地图,因为我需要将其为空

var myMap: mutable.Map[String, ListBuffer[Objects]] = mutable.Map[String, ListBuffer[Objects]]()

对象类型签名很长,因此我试图在如下所示的包对象中声明自己的类型别名。

type MyMapType = mutable.Map[String, ListBuffer[Objects]]

问题是,当我尝试使用别名声明地图时,它似乎不起作用。

var myMap: MyMapType = MyMapType()

我说一个错误

  

ListBuffer [Objects]类型的表达与预期的MyPackageObject.MyMapType类型不符

2 个答案:

答案 0 :(得分:4)

尝试一下:

import collection.mutable.{Map, ListBuffer}
type MyMapType = Map[String, ListBuffer[Object]]
var myMap: MyMapType = Map()

之所以起作用,Map()Map.apply()的快捷方式。这是对称为Map的对象的方法调用。它是mutable.Map的伴随对象。它的名称属于一组完全独立的标识符:类型的名称与对象的名称无关。因此,伴随对象Map仍称为Map。请注意,由于类型推断,您可以忽略.apply()的所有类型参数。

答案 1 :(得分:3)

要编写类似MyMapType()之类的内容,除了类型之外,还需要为随播对象提供别名:

val MyMapType = mutable.Map

对于这种情况,这不是很理想,但是

var myMap: MyMapType = MyMapType()

将起作用。不幸的是

var myMap = MyMapType() // or MyMapType.empty

不会。您真正需要的是

object MyMapType {
  // define the methods you want, e.g.
  def apply(items: (String, ListBuffer[Object])*): MyMapType = Map(items: _*)
  def empty: MyMapType = Map.empty
  // etc
}

当然,您可以定义一个返回此类“伴侣对象”的方法。

作为一个旁注,您通常拥有var或可变集合,两者在一起很少见。