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

fra*_*lin 0 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 } 
Run Code Online (Sandbox Code Playgroud)

然后,我可以强制执行以下类型:

Map[String, Container]
Run Code Online (Sandbox Code Playgroud)

但这仍然需要客户端知道string-key-1类型不能映射到BigDecimalContainer。有什么方法可以创建内部映射元组的逻辑(key, container type) => value?我需要某种隐式谓词功能,不是吗?

Ale*_*kov 5

您可以使用不精简的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)
Run Code Online (Sandbox Code Playgroud)