3

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]ますか?

4

1 に答える 1

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)

ここで必要なのは、getAsを使用する場所にmap2MapTをインポートしておくことだけです。

scala 2.10では、そのように名付けられた暗黙のクラスを利用して、次のように書くことができます。

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

ラッパーを作成したくない場合は、別の2.10機能を使用できます--value class

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 に答える