当我这样做时
val oldId :Long = 123;
val i = 1
val newId = (oldId: @switch) match {
case 1 => 1234
case 2 => 5678
case 3 => 1122
case 4 => 3344
}
我收到编译器警告
[ant:scalac] mycode.scala:25: warning: could not emit switch for @switch annotated match
[ant:scalac] val newId = (oldId: @switch) match {
[ant:scalac] ^
[ant:scalac] one warning found
但是,如果我改为使用以下代码
val oldId :Int = 123;
val i = 1
val newId = (oldId: @switch) match {
case 1 => 1234
case 2 => 5678
case 3 => 1122
case 4 => 3344
}
然后编译器没有给我一个警告。为什么无法使用Long
并获得tableswitch
?
答案 0 :(得分:5)
为什么不能使用Long并获得一个tablewitch?
因为JVM supports @tableswitch on int
and types convertable to int
:
Java虚拟机的tableswitch和lookupswitch指令仅对int数据有效。因为对byte,char或short值的操作在内部被提升为int,所以将表达式求值为其中一种类型的开关编译为就像它被计算为int类型一样
因此,您会收到编译时警告,因为long
无法隐式转换为int
。