Class [_]类型上的模式匹配吗?

问题描述 投票:13回答:3

[我正在尝试在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 reflection pattern-matching
3个回答
17
投票

如果将变量名更改为大写(或在模式中用反引号将其括起来,则代码将按预期工作:] >>

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以获取更多信息。


8
投票

关于模式匹配,这两种情况都尝试创建占位符名称,而不是按预期的方式匹配类类型。


0
投票

JMPL是简单的Java库,可以使用Java 8功能来模拟某些功能模式匹配。

© www.soinside.com 2019 - 2024. All rights reserved.