将一个getAs [T]方法添加到Map

时间:2013-01-30 21:43:02

标签: scala

我想向getAs[T](key)添加一个Map方法,它将返回值asInstanceOf[T],当值类型为Any时,我觉得这很有用。这是我尝试使用特质。

trait MapT extends Map[Any, Any] {
  def getAs[T](key: Any): T = super.apply(key).asInstanceOf[T]
}
val map = new Map[Any,Any] with MapT

但是,编译器不允许我这样做,因为+-iteratorget方法没有定义,我真的不知道想要定义。

我该怎么做呢?对getAs[T]有更好的方法吗?

1 个答案:

答案 0 :(得分:9)

你可以使用enrich-my-library模式(以前​​的pimp-my-library):

class MapT(underlying: Map[Any,Any]) {
  def getAs[T](key: Any): T = underlying.apply(key).asInstanceOf[T]
}

implicit def map2MapT(m: Map[Any,Any]) = new MapT(m)

现在您只需要将map2MapT导入到您希望使用getAs的位置。

在scala 2.10中,您可以使用所谓的隐式类,并将其写为:

implicit class MapT(underlying: Map[Any,Any]) {
      def getAs[T](key: Any): T = underlying.apply(key).asInstanceOf[T]
}

如果您不想生成包装器,可以使用另一个2.10功能 - 值类

implicit class MapT(val underlying: Map[Any,Any]) extends AnyVal {
      def getAs[T](key: Any): T = underlying.apply(key).asInstanceOf[T]
}

因此,编译器将切割MapT类,并在每个调用站点处保留内联的getAs [T]方法。