如何匹配Scala"匹配"语句中的类?

Tim*_*Tim 20 scala

如何使用"匹配"语句来标识类变量的值?以下是无效的,我找不到一个可接受的变体 - 除了if ... else if ... else ...

val c: Class[_] = classOf[Int]
val what = c match { case classOf[Int] => "int!"; case classOf[Float] => "float!" }
Run Code Online (Sandbox Code Playgroud)

编译器抱怨: error: not found: type classOf

当然,我无法使用,Class[Int]因为该类型信息被删除:

c match { case Class[Int] => "int!"; case Class[Float] => "float!" }
error: type Class of type Class does not take type parameters.
Run Code Online (Sandbox Code Playgroud)

我也试过各种变体Int.class,但都无济于事.(而且我真的不想转换为字符串:我觉得让编译器捕获重命名/移动的类非常重要.)

我是否密集,或者我偶然发现斯卡拉盲点?

Deb*_*ski 28

冗长的案例比较有效:

val what = c match {
  case q if q == classOf[Int] => "int!"
  case q if q == classOf[Float] => "float!"
}
Run Code Online (Sandbox Code Playgroud)

当然,作为小写标识符,classOf不应该直接在case语句中工作.然而,逃脱也没有

case `classOf`[Int]
Run Code Online (Sandbox Code Playgroud)

在这种情况下工作,所以你必须使用if-guard.


Mil*_*bin 21

如果为它们创建稳定的标识符(即val),则可以匹配类值,

scala> val c: Class[_] = classOf[Int]
c: Class[_] = int

scala> val ClassOfInt = classOf[Int]
ClassOfInt: java.lang.Class[Int] = int

scala> val ClassOfFloat = classOf[Float]
ClassOfFloat: java.lang.Class[Float] = float

scala> val what = c match {
     |     case ClassOfInt => "int!"
     |     case ClassOfFloat => "float!"
     | }
what: String = int!
Run Code Online (Sandbox Code Playgroud)

请注意,您无法匹配类型(即Class [Int]),因为擦除意味着Class [T]的不同类型实例在运行时无法区分...因此下面的警告

scala> val what = c match {
     |     case _: Class[Int] => "int!"
     |     case _: Class[Float] => "float!"
     | }
warning: there were 2 unchecked warnings; re-run with -unchecked for details
what: java.lang.String = int!
Run Code Online (Sandbox Code Playgroud)

  • 重要说明:`val` 的名称必须以大写开头。 (3认同)