我试图弄清楚这段代码发生了什么,试图弄清楚是否有我不理解的东西,或者它是否是编译器错误或不直观的规范,让我们定义这两个几乎相同的函数:
def typeErause1(a: Any) = a match {
case x: List[String] => "stringlists"
case _ => "uh?"
}
def typeErause2(a: Any) = a match {
case List(_, _) => "2lists"
case x: List[String] => "stringlists"
case _ => "uh?"
}
现在,如果我打电话给typeErause1(List(2,5,6))
我"stringlists"
,因为即使它实际上是List[Int]
类型擦除,也无法区分。但奇怪的是,如果我打电话给typeErause2(List(2,5,6))
我"uh?"
,我不明白为什么它List[String]
不像以前那样匹配。如果我List[_]
在第二个函数上使用它,它能够正确匹配它,这让我认为这是 scalac 中的一个错误。
我正在使用 Scala 2.9.1