alp*_*eek 12 reflection scala pattern-matching
我正在尝试在Java Class [_]上使用Scala模式匹配(在使用Scala的Java反射的上下文中)但是我遇到了一些意外错误.以下给出了案例jLong的 "无法访问的代码"
def foo[T](paramType: Class[_]): Unit = {
val jInteger = classOf[java.lang.Integer]
val jLong = classOf[java.lang.Long]
paramType match {
case jInteger => println("int")
case jLong => println("long")
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会这样?
Tra*_*own 16
如果您将变量名称更改为大写(或使用模式中的反引号将它们包围),代码将按预期工作:
scala> def foo[T](paramType: Class[_]): Unit = {
| val jInteger = classOf[java.lang.Integer]
| val jLong = classOf[java.lang.Long]
| paramType match {
| case `jInteger` => println("int")
| case `jLong` => println("long")
| }
| }
foo: [T](paramType: Class[_])Unit
scala> foo(classOf[java.lang.Integer])
int
Run Code Online (Sandbox Code Playgroud)
在您的代码jInteger中,第一个模式中的是一个新变量 - 它不是jInteger来自周围范围的变量.从规格:
8.1.1变量模式
...变量模式x是一个以小写字母开头的简单标识符.它匹配任何值,并将变量名称绑定到该值.
...
8.1.5稳定的标识符模式
...要解决与变量模式的语法重叠,稳定的标识符模式可能不是以小写字母开头的简单名称.但是,可以在反引号中包含这样的变量名称; 然后将其视为稳定的标识符模式.
有关更多信息,请参阅此问题.
在模式匹配上,这两种情况中的每一种都尝试创建占位符名称,而不是按预期匹配类类型.
如果你在起始角色中使用大写,你会没事的
def foo[T](paramType: Class[_]): Unit = {
val JInteger = classOf[Int]
val JLong = classOf[Long]
paramType match {
case JInteger => println("int")
case JLong => println("long")
}
}
scala> foo(1.getClass)
int
Run Code Online (Sandbox Code Playgroud)