首先最核心的原因:Java 设计 switch 时,底层是基于 int 类型实现的。
- switch 的字节码指令(比如
lookupswitch/tableswitch)只认 int 类型,所有能进 switch 的类型(byte/short/char/String),最终都会转成 int 处理; - long 是 64 位,取值范围远大于 int(32 位),没法无损转成 int,所以直接不支持。
其次是设计层面:就算硬要支持 long,也会大幅增加 JVM 实现复杂度,而实际开发中用 long 做 switch 判断的场景极少,性价比太低。
总结:
- switch 底层依赖 int 指令实现,long 无法转 int;
- 场景少+实现成本高,没必要支持。