【发布时间】:2015-03-13 10:19:20
【问题描述】:
在下面的代码中,映射键可以直接使用,也可以存储在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)
}
最后一行显示的完整错误是:
错误:(16, 8) 类型不匹配;
找到:Main.kk.key.type(底层类型为FooKey)
必需:使用 FooKey 可序列化的产品
这是什么原因?为什么密钥一旦存储在case class 中就不再被接受并且类型检查失败?
【问题讨论】:
-
这里有一些编译器的东西。
val m : Map[FooKey, String] = Map(KeyA -> "A", KeyB -> "B") m(kk.key)似乎有效。
标签: scala dictionary types