如何初始化类型别名的空映射

ale*_*lex 5 types scala scala-collections type-alias

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

var myMap: mutable.Map[String, ListBuffer[Objects]] = mutable.Map[String, ListBuffer[Objects]]()
Run Code Online (Sandbox Code Playgroud)

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

type MyMapType = mutable.Map[String, ListBuffer[Objects]]
Run Code Online (Sandbox Code Playgroud)

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

var myMap: MyMapType = MyMapType()
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息

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

And*_*kin 6

尝试这个:

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

这样做的原因: Map()Map.apply(). 这是对名为 的对象的方法调用Map。它是 的伴随对象mutable.Map。它的名称属于一组完全独立的标识符:类型的名称独立于对象的名称。因此,伴生对象Map仍称为Map。请注意,.apply()由于类型推断,您可以省略所有类型参数。

  • @alex [关键字:“类型擦除”](/sf/ask/1743010041/)。 (2认同)

Ale*_*nov 5

要编写类似的MyMapType()内容,除了类型之外,您还需要一个伴生对象的别名:

val MyMapType = mutable.Map
Run Code Online (Sandbox Code Playgroud)

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

var myMap: MyMapType = MyMapType()
Run Code Online (Sandbox Code Playgroud)

将工作。很遗憾,

var myMap = MyMapType() // or MyMapType.empty
Run Code Online (Sandbox Code Playgroud)

惯于。你真正需要的是

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

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

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