如何使用"匹配"语句来标识类变量的值?以下是无效的,我找不到一个可接受的变体 - 除了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)
归档时间: |
|
查看次数: |
10931 次 |
最近记录: |