例如,我知道在运行时我只有以下键:string-key-1
,number-key-1
。
我可以像这样创建键映射到键入的值:
sealed trait Container {
type T
def resolve: T = this match {
case StringContainer(s) => s.asInstanceOf[String]
case BigDecimalContainer(n) => n.asInstanceOf[BigDecimal]
// and more
}
}
final case class StringContainter(v: String) { type T = String }
final case class BigDecimalContainer(v: BigDecimal) { type T = BigDecimal }
然后我可以强制执行以下类型:
Map[String, Container]
但这仍然需要客户端知道string-key-1
类型不能映射到BigDecimalContainer
。有什么方法可以创建内部映射(key, container type) => value
元组的逻辑?我可能需要某种隐式谓词功能,不是吗?
答案 0 :(得分:5)
您可以使用shapless hmap:
class KeyToValue[K, V]
case class StringKey(key: String)
case class IntKey(key: String)
implicit val keyToString = new KeyToValue[StringKey, String]
implicit val keyToInt = new KeyToValue[IntKey, Int]
val map = HMap[KeyToValue](
StringKey("string-key") -> "string-value",
IntKey("int-key") -> 0
)
val stringValueOption = map.get(StringKey("string-key")) //will be Some("string-value")
val intValueOption = map.get(IntKey("int-key")) //will be Some(0)