Sum*_*uma 2 dictionary types scala
在下面的代码中,map键可以直接使用,也可以存储在a中val,但不能存储在case class:
sealed trait FooKey
case object KeyA extends FooKey
case object KeyB extends FooKey
case class KaseKey(key:FooKey)
object Main extends App {
val m = Map(KeyA -> "A", KeyB -> "B")
val kk = KaseKey(KeyA)
val kv = KeyA
m(KeyA) // works
m(kv) // works
m(kk.key) // error: found: Main.kk.key.type (with underlying type FooKey)
}
Run Code Online (Sandbox Code Playgroud)
最后一行显示的完整错误是:
错误:(16,8)类型不匹配;
发现:Main.kk.key.type(底层类型为FooKey)
必需:带有FooKey Serializable的产品
这是什么原因?为什么密钥不再被接受,一旦存储在一个类型检查中失败case class?
这是因为以下行推断出键的类型:
val m = Map(KeyA -> "A", KeyB -> "B")
Run Code Online (Sandbox Code Playgroud)
如果您查看REPL,它会告诉您它看到了Map[Product with Serializable with FooKey,String].这是因为常见的超类型的KeyA和KeyB就是这样.案例类为您提供了Product允许迭代产品元素,定义equals和的特征hashCode.
所以你应该注释你的地图:
val m = Map[FooKey, String](KeyA -> "A", KeyB -> "B")
Run Code Online (Sandbox Code Playgroud)
或者你定义
sealed trait FooKey extends Product with Serializable
Run Code Online (Sandbox Code Playgroud)