【问题标题】:How to initialize empty map that has been type aliased如何初始化类型别名的空映射
【发布时间】:2019-01-28 03:32:22
【问题描述】:

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

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 类型

【问题讨论】:

    标签: scala types scala-collections type-alias


    【解决方案1】:

    试试这个:

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

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

    【讨论】:

    • 我不确定这是否应该在评论中,但无论如何我都会问。当我创建像“type MyMapType2 = Map[String, Int]”这样的第二种类型并使用“myMap.isInstanceOf(MyMapType2)”进行比较时,它返回true。它们都是地图,但它们持有的类型不同。为什么会返回 true?
    【解决方案2】:

    要编写类似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 或可变集合,两者一起应该很少见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      相关资源
      最近更新 更多