为什么不可变映射具体类未定义为案例类?



如果有人想在整个Map对象上应用模式匹配,该怎么办?

示例(虽然没有编译)是:

def main(args: Array[String]) {
    val m: Map[String, Int] = Map("a" -> 1, "b" -> 2) //scala.collection.immutable.Map2
    m match {
      case Map2("a",1,"b",2)  => println("matched")   //conceptual code line 
      case _ => println("not matched")
    }
}

阻止Map2定义为case类的可能原因是什么?

  • Case类防止内部字段的封装?(如key1value1…)
  • Case类不适用泛型类型参数?
  • 很少使用匹配整个地图(通常毫无意义)?

一个突出的原因是,从case类派生新类往好了说是不赞成的,往坏了说是危险的。为了允许用户(或Scala标准库作者)从这些类派生,它们可能不是case类。

最新更新