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

标签 scala dictionary types

在下面的代码中,映射键可以直接使用,也可以存储在 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]。这是因为 KeyAKeyB 的通用父类(super class)型就是这样。案例类为您提供 Product 特性,允许迭代产品元素,定义 equalshashCode

因此您应该在 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/

相关文章:

types - 具有差异列表的 Nat 类型

scala - 如何创建内容是表达式结果的有限迭代器?

python - 如何读取文本文件并转换为字典?

scala 类型 'extraction'

swift - 遍历字典并创建对象实例

python - 简明 Python 3.x 批量字典查找

java泛型扩展类型错误

java - Apache Spark 工作线程超时

list - List(1,2,3) 在 Scala 中如何工作?

scala - Scala 2.9的try…catch泛化有哪些用例?