在下面的代码中,映射键可以直接使用,也可以存储在 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)
}
最后一行显示的完整错误是:
Error:(16, 8) type mismatch;
found : Main.kk.key.type (with underlying type FooKey)
required: Product with Serializable with FooKey
这是什么原因?为什么 key 一旦存储在 case class
中就不再被接受并且无法通过类型检查?
最佳答案
这是因为由以下行推断的 key 类型:
val m = Map(KeyA -> "A", KeyB -> "B")
如果您查看 REPL,它会告诉您它看到了 Map[Product with Serializable with FooKey,String]
。这是因为 KeyA
和 KeyB
的通用父类(super class)型就是这样。案例类为您提供 Product
特性,允许迭代产品元素,定义 equals
和 hashCode
。
因此您应该在 map 上添加注释:
val m = Map[FooKey, String](KeyA -> "A", KeyB -> "B")
或者你定义
sealed trait FooKey extends Product with Serializable
关于scala - 为什么从案例类中提取时 Map 键类型不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29029743/