さまざまな構築型の値を使用してマップを作成できるかどうかを知りたいです。このような:
class WowClass[A <: HeyClass]
val map = Map[String, WowClass[A <: HeyClass]]()
値がHeyClass
?の異なる子になることができるように
さまざまな構築型の値を使用してマップを作成できるかどうかを知りたいです。このような:
class WowClass[A <: HeyClass]
val map = Map[String, WowClass[A <: HeyClass]]()
値がHeyClass
?の異なる子になることができるように
宣言された値型のサブタイプをマップに確実に格納できますが、マップから読み取ると、 type の値、つまり階層の上位の型境界をV
取得することしかわかりません。V
詳細を知る必要がある場合は、値に対してパターン マッチを行うことができます。
trait V
case class A1() extends V
case class A2() extends V
var map = Map[String, V]()
map += ("A1" -> A1())
map += ("A2" -> A2())
map.values.head match {
case a1: A1 => println("A1")
case a2: A2 => println("A2")
}
それが十分に正確でない場合は、HListsを見てください。これらは、ある意味では、n-タプルの型安全な実装、つまり、自然数のキーと任意の型の値を持つ固定サイズのマップです。
a (読み取り専用)Map[K, V]
を関数として表示K -> V
すると、さまざまな型の値を取り、各キーに対して返される値の正確な型を静的に認識しているマップを直接持つことができない理由を理解するのに役立ちます。"foo"
上記の関数シグネチャを考えると、 keyが の値を返すのV1 <: V
に対して、 key"bar"
が型の値を返すことを静的に知るにはどうすればよいV2 <: V
でしょうか? この追加情報は何らかの形で関数シグネチャの一部である必要がありますが、実際には HList の場合です。
Miles Sabins Shapelessは、HLists または HMaps を使用している場合、正確な型を取得します。例を見て、それらがあなたにとって正しい方向であるかどうかを確認する価値があるかもしれません.