我可以在枚举上使用switch-case进行模式匹配吗?
我试过
import scala.annotation.switch
object Foo extends Enumeration {
val First = Value
val Second = Value
val Third = Value
}
object Main {
def foo(x: Foo.Value) = (x: @switch) match {
case Foo.First => 1
case Foo.Second => 2
case Foo.Third => 3
}
}
但得到以下警告(Scala 2.11.4):
warning: could not emit switch for @switch annotated match
def foo(x: Foo.Value) = (x: @switch) match {
然后我尝试用Java定义枚举,因为Java的enum
与Scala的Enumeration
不同。仍然没有运气。
它@switch
模式匹配仅在原始类型上可用吗?
答案 0 :(得分:1)
switch
注释的要点是确保将匹配编译为tableswitch
或lookupswitch
JVM指令。这些说明仅适用于整数,这意味着switch
注释只会对可以安全地适合Int
的类型产生任何影响。含义Int
本身以及Char
,Byte
,Short
和Boolean
。此外,您匹配的值必须是文字值(而不是存储在val
中的值)。鉴于Enumeration
是参考值,它们与switch
注释不兼容。关于文字值的限制实际上意味着可能无法使用此注释Short
和Byte
,纯粹出于语法原因,因为scala中不支持文字短路和字节:你必须使用文字int以及123: Byte
中的类型归属,但这不作为模式接受。
因此,只留下Int
,Char
和Boolean
作为有效类型(使用@switch
作为布尔值的用处可疑至少可以说)
答案 1 :(得分:1)
要完成Regis的答案,在Scala In Depth中,Joshua Suereth声明Scala应用tableswitch优化时必须满足以下条件:
Foo对象与上述任何条件都不匹配,但它不是tableswitch优化的主题。