类[_]类型的模式匹配?

时间:2011-09-22 17:45:36

标签: scala reflection pattern-matching

我正在尝试在Java Class [_]上使用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")
  }
}

为什么会发生这种情况?

3 个答案:

答案 0 :(得分:15)

如果您将变量名称更改为大写(或用模式中的反引号将它们包围起来),代码将按预期工作:

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

答案 1 :(得分:7)

在模式匹配上,这两种情况中的每一种都尝试创建占位符名称,而不是按预期匹配类类型。

如果你在起始角色中使用大写,你会没事的

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

答案 2 :(得分:0)

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

appBarConfiguration