2010-11-30 16 views
6

パラメータ名とその値を格納するハッシュマップを作成したいとします。しかし、パラメータは異なるタイプである。私はHashMap [String、Any]を使うことができましたが、後でどのタイプがあるのか​​わかりません。とにかく私はタイプ情報を回復することができますか?または、ペアを保存するための良い方法はありますか?scala reflection

+0

[Scalaでタイプ消去を回避するにはどうすればよいですか?または、なぜ私のコレクションの型パラメータを取得できませんか?](http://stackoverflow.com/questions/1094173/how-do-i-get-around-type-erasure-on-scala-or-why -cant-i-get-the-type-parameter) –

+0

これらの回答はどれですか?そうでない場合は、お客様の要件をよりよく満たすためのフィードバックがありますか? –

+0

まあ、それらのどれも私の問題を本当に解決しませんでした。私は(上級者に)エレガントな解決策がないと言われました。私は後でそのような問題を避けるためにデザインを変更しました... – user398384

答えて

5

静的型情報または動的型情報にアクセスしますか?前者の場合は、型付きキーを使用できます。これらの線に沿って何か動作するはずです:

final class Key[T] 

object Registry { 
    private var backingMap: Map[Key[_], _] = Map.empty 

    def put[T](k: Key[T], v: T) = backingMap += (k -> v) 

    def get[T](k: Key[T]): Option[T] = backingMap get k map (_.asInstanceOf[T]) 
} 

scala> val strKey = new Key[String] 
strKey: Key[String] = [email protected] 

scala> val intKey = new Key[Int] 
intKey: Key[Int] = [email protected] 

scala> Registry.put(strKey, "asdf") 

scala> Registry.get(strKey) 
res0: Option[String] = Some(asdf) 

scala> Registry.put(intKey, "asdf") 
<console>:10: error: type mismatch; 
found : Key[Int] 
required: Key[Any] 
     Registry.put(intKey, "asdf") 

代わりに、あなたは、型指定されていないキーを使用して(Daniel suggestedなど)マニフェストを使用してMapの型情報を格納することができます:

class Registry[K] { 
    import scala.reflect.Manifest 

    private var _map= Map.empty[K,(Manifest[_], Any)] 

    def put[T](key: K, item: T)(implicit m: Manifest[T]) { 
     _map += (key -> (m, item)) 
    } 

    def get[T](key:K)(implicit m : Manifest[T]): Option[T] = { 
     for ((om, v) <- _map get key if om <:< m) 
     yield v.asInstanceOf[T] 
    } 
} 

後者のアプローチは、その利点を持っていますあなたは何かをキーとして使うことができ、オリジナルのタイプされたキーオブジェクトを渡す必要はありません。ただし、getメソッドを呼び出すときに値の型を指定する必要があるという欠点があります。間違ったタイプを指定すると、キーがレジストリにまったくないのと全く同じようにNoneが得られますが、入力されたキーではキーに関連付けられた値が保証されます。

1

値があまり多くない場合は、HListのペアまたは同様の構文を使用することを検討してください。

3

thisを参照してください。これはあなたの求めるものを正確に実装しています。

+0

ニース!私はあなたの実装を私の答えで幾分単純化し、タイプされたキーアプローチと格納されたマニフェストアプローチの違いを説明しようとしました。 –