我想添加一个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)
但是,编译器不会让我做这件事,因为+,-,iterator和get方法都没有定义,我真的不想定义.
我该怎么做呢?有更好的方法getAs[T]吗?
你可以使用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]方法.
| 归档时间: |
|
| 查看次数: |
1903 次 |
| 最近记录: |