我可以强制地图中的某些键在Scala中具有某些类型吗?

时间:2019-05-24 15:22:03

标签: scala refinement-type

例如,我知道在运行时我只有以下键:string-key-1number-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元组的逻辑?我可能需要某种隐式谓词功能,不是吗?

1 个答案:

答案 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)