为什么scala能够将Long switch语句编译为tableswitch

时间:2016-03-13 21:08:11

标签: scala switch-statement

当我这样做时

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

1 个答案:

答案 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