从案例类中提取时,为什么Map键类型不起作用?

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

0__*_*0__ 6

这是因为以下行推断出键的类型:

val m = Map(KeyA -> "A", KeyB -> "B")
Run Code Online (Sandbox Code Playgroud)

如果您查看REPL,它会告诉您它看到了Map[Product with Serializable with FooKey,String].这是因为常见的超类型的KeyAKeyB就是这样.案例类为您提供了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)