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

vik*_*man 3 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
Run Code Online (Sandbox Code Playgroud)

但是,编译器不会让我做这件事,因为+,-,iteratorget方法都没有定义,我真的不想定义.

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

om-*_*nom 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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