パラメータ名とその値を格納するハッシュマップを作成したいとします。しかし、パラメータは異なるタイプである。私はHashMap [String、Any]を使うことができましたが、後でどのタイプがあるのかわかりません。とにかく私はタイプ情報を回復することができますか?または、ペアを保存するための良い方法はありますか?scala reflection
6
A
答えて
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
ニース!私はあなたの実装を私の答えで幾分単純化し、タイプされたキーアプローチと格納されたマニフェストアプローチの違いを説明しようとしました。 –
関連する問題
- 1. scala reflection error java
- 2. Java Reflection
- 3. Reflection&WCF
- 4. Java Reflection
- 5. Android enum reflection
- 6. Entity Framework - Reflection
- 7. NPE with reflection
- 8. Java Reflection、getMethod()
- 9. Java Reflection getConstructorメソッド
- 10. Java Reflection、Class Objects
- 11. javascript reflection library
- 12. .Net Reflection GetProperties()
- 13. c#、Internal、Reflection
- 14. .NET/C# - Reflection - System.IO.File ever
- 15. Reflectionでプライベートメソッドをオーバーライド
- 16. C#属性PropertyType Reflection
- 17. Java Reflection isArray()always false
- 18. Reflection API - ClassNotFound例外
- 19. C#Reflection on this-Object
- 20. android getSystemService(String s) - reflection?
- 21. Reflectionの作成Opengl
- 22. ComboBox SelectedValue via Reflection as DependencyProperty
- 23. Generics&Reflection - GenericArguments [0]はタイプ
- 24. Maven Shade Plugin for Java reflection
- 25. ScalaでのScala
- 26. Java Reflectionの受け渡しパラメータ
- 27. Reflection Terminal Emulator - IEとの統合
- 28. Reflectionの問題点は何ですか?
- 29. Java Reflectionは質問と同じです
- 30. Java Reflection:実装クラスを作成する
[Scalaでタイプ消去を回避するにはどうすればよいですか?または、なぜ私のコレクションの型パラメータを取得できませんか?](http://stackoverflow.com/questions/1094173/how-do-i-get-around-type-erasure-on-scala-or-why -cant-i-get-the-type-parameter) –
これらの回答はどれですか?そうでない場合は、お客様の要件をよりよく満たすためのフィードバックがありますか? –
まあ、それらのどれも私の問題を本当に解決しませんでした。私は(上級者に)エレガントな解決策がないと言われました。私は後でそのような問題を避けるためにデザインを変更しました... – user398384