3

我想向 中添加一个getAs[T](key)方法Map,该方法将返回值asInstanceOf[T],当值类型为 时,我发现它很有用Any。这是我使用 trait 的尝试。

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]吗?

4

1 回答 1

9

您可以使用丰富我的图书馆模式(前皮条客我的图书馆):

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] 方法。

于 2013-01-30T21:46:39.107 回答