【发布时间】:2016-05-13 16:16:52
【问题描述】:
我报告了一个听起来很奇怪的功能,并且无法通过 scala 中的模式匹配来推断以下行为。
def typesPattern(x:Any)= x match{
case s:String⇒ s.length
case n:Map[Int,Int]⇒println("Map[Int,Int]");var a = n.iterator.next();println(a._1);println(a._2);n.size;
case n:Map[a,b]⇒println("Map[a,b]");n.size;
case m:Map[_,_]⇒ m.size
case _ ⇒ -1
}
}
当我使用以下println(typesPattern(Map("a"→10))) 调用上述函数时,我收到以下错误Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(BoxesRunTime.java:101)
at scala.Tuple2._1$mcI$sp(Tuple2.scala:20)
第一个问题是“为什么 MAP[String->Int] 与 MAP[INT,INT] 匹配?”,它应该相当匹配MAP[_,_]。
有趣的是,当我编辑模式匹配代码并取出从 Map 中提取元组并打印键值对的代码时
`def typesPattern(x:Any)= x match{
case s:String⇒ s.length
case n:Map[Int,Int]⇒println("Map[Int,Int]");n.size;
case n:Map[a,b]⇒println("Map[a,b]");n.size;
case m:Map[_,_]⇒ m.size
case _ ⇒ -1
}
}`
现在,与之前的 println(typesPattern(Map("a"→10))) 相同的调用确实匹配 MAP[INT,INT] 没有问题并打印大小。
Map[Int,Int]
1
第二个问题 “为什么这次 SCALA 能够毫无问题地匹配 MAP[String->INT] 和 MAP[INT->INT](我仍然想知道如何?)?
【问题讨论】: