我想向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
但是,编译器不允许我这样做,因为+
,-
,iterator
和get
方法没有定义,我真的不知道想要定义。
我该怎么做呢?对getAs[T]
有更好的方法吗?
答案 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]方法。