【问题标题】:Scala: convenient binding of collection type parametersScala:集合类型参数的便捷绑定
【发布时间】:2011-11-18 01:07:25
【问题描述】:

为了方便、清晰和抽象,我想为参数化集合特征的特定绑定起一个名字。例如,首先考虑:

import collection.mutable.Map // NB: Map is a trait
val m1 = Map[String, Int]()   // uses the Map companion object to create a HashMap

现在我想用MyMap 替换Map[String, Int]。理想情况下,我只想做类似的事情:

trait MyMap extends Map[String, Int]
object MyMap extends Map[String, Int]   // not good enough by itself, need some apply defs
val m2 = MyMap()                        // nope

我可以向 MyMap 伴生对象添加更多内容,或者我可以让 MyMap 扩展 HashMap[String, Int] 并忘记依赖 Map 伴生对象内部的魔法默认设置。

但是对于应该简单的事情来说,这些替代方案似乎工作量太大:我只希望 MyMap 在任何出现的地方都像 Map[String, Int] 一样行事。最简单的方法是什么,还是我错过了一些更深层次的原则?

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    使用类型别名:

    type MyMap = Map[String, Int]
    

    注意这不会给你object MyMap,如果你定义它,它不是伴随对象(object Map是)并且编译器不会检查它的隐式转换.

    【讨论】:

    • 您可以使用 val MyMap = Map.apply[String, Int] _ 轻松访问工厂方法(即 apply(..)),但同样,这不是伴随对象,只是一个函数。
    • val MyMap = Map 会给你一个伴侣。
    • val MyMap = Map 并没有为我提供 Map[String, Int] 的伴侣,但这正是我想要的。
    【解决方案2】:

    @Alexey Romanov 类型别名不会为您提供工厂方法。另一方面,导入会。

    scala> import collection.mutable.{Map => MyMap}
    scala> val m1 = MyMap()
    m1: scala.collection.mutable.Map[Nothing, Nothing] = Map()
    

    【讨论】:

    • 嗯,但是导入使 MyMap 成为 Map 的另一个名称,而不是 Map[String, Int],正如我所愿。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2015-10-20
    相关资源
    最近更新 更多