Fra*_*ank 11 scala pattern-matching
当使用完全限定的类名参数化时,我在Scala中的对象模式匹配中遇到一些问题.这基于Scala 2.9.0.1.谁知道这段代码有什么问题?
scala> "foo" match {
| case y : Seq[Integer] =>
| case y : Seq[java.lang.Integer] =>
<console>:3: error: ']' expected but '.' found.
case y : Seq[java.lang.Integer] =>
Run Code Online (Sandbox Code Playgroud)
为什么第一个版本有效,但后者失败了?当完全限定的类名用于参数化时,似乎只会出现此问题.
Mat*_*ell 12
从Scala语言规范的 8.1节模式中,标识符后面的标识符需要是第8.2节中定义的类型模式:
类型模式由类型,类型变量和通配符组成.类型模式T具有以下形式之一:
...
参数化类型模式T [a(1),. ..,a(n)],其中a(i)是类型可变模式或通配符_.对于类型变量和通配符的某些任意实例化,此类型模式匹配与T匹配的所有值.这些类型变量的边界或别名类型如(第8.3节)中所述确定.
...
类型变量模式是一个简单的标识符,以小写字母开头.但是,预定义的基本类型别名unit,boolean,byte,short,char,int,long,float和double不归类为类型变量模式.
因此,从语法上讲,您不能将完全限定的类用作此位置中的类型变量模式.但是,您可以使用类型别名,因此:
type JavaInt = java.lang.Integer
List(new java.lang.Integer(5)) match {
case y: Seq[JavaInt] => 6
case _ => 7
}
Run Code Online (Sandbox Code Playgroud)
将按预期返回6.问题在于Alan Burlison指出,以下内容也会返回6:
List("foobar") match {
case y: Seq[JavaInt] => 6
case _ => 7
}
Run Code Online (Sandbox Code Playgroud)
因为类型正在被删除.您可以通过使用-unchecked选项运行REPL或scalac来查看此信息.