[我正在尝试在Java类上使用Scala模式匹配[_](在使用来自Scala的Java反射的上下文中),但是出现了一些意外错误。下面在case 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")
}
}
任何想法为什么会这样?
如果将变量名更改为大写(或在模式中用反引号将其括起来,则代码将按预期工作:] >>
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
在您的代码中,第一个模式中的
jInteger
是一个新变量,而不是周围范围的jInteger
。从specification:
8.1.1可变模式
...可变模式x是一个简单的标识符,以小写字母开头。它匹配任何值,并将变量名称绑定到该值。
...
8.1.5稳定的标识符模式
...要解决带有可变模式的语法重叠,标识符模式可能不是以小写字母开头的简单名称信。但是,可以将这样的变量名包含在反引号;然后将其视为稳定的标识符模式。
请参阅this question以获取更多信息。
关于模式匹配,这两种情况都尝试创建占位符名称,而不是按预期的方式匹配类类型。
JMPL是简单的Java库,可以使用Java 8功能来模拟某些功能模式匹配。