java中仅byte、short、char、int支持switch,因其可无损转为int参与跳转表计算;long/float/double/boolean因范围、精度或语义问题被排除;case值须为编译期常量且类型兼容,包装类通过自动拆箱实现支持。

Java 中的 byte、short、char、int 这四种基本数据类型可以直接用于 switch 表达式,这是从 Java 1.0 就支持的原生能力。
为什么只支持这四种?
因为它们在 JVM 底层都能无损地转换为 int 类型参与跳转表(jump table)计算。编译器会自动完成隐式提升:
- byte、short、char 在参与 switch 时,会被当作 int 处理(例如 char 'A' 对应 ASCII 值 65)
- int 直接使用其数值
- long、float、double、boolean 不支持——前者范围超限,后三者存在精度或语义不匹配问题
使用时的注意事项
case 后的值必须是编译期常量,且类型需与表达式兼容:
- 如果 switch 表达式是 char,case 可以写 'a' 或 97(两者等价)
- 如果表达式是 byte b = 10,case 必须写 10,不能写 10L 或 10.0
- 不同整型字面量之间不可混用:case 10000000000 是 long,不能匹配 int 表达式
实际写法示例
以下代码合法且常见:
byte day = 2;
switch (day) {
case 1: System.out.println("Monday"); break;
case 2: System.out.println("Tuesday"); break;
default: System.out.println("Other");
}
这段代码中,day 是 byte,但每个 case 的值都是 int 字面量——Java 允许这种隐式兼容,因为 1、2 等可以安全转为 byte。
包装类型也能用,但本质还是拆箱
Byte、Short、Character、Integer 这些包装类之所以可用,是因为编译器会在编译期自动插入 xxxValue() 拆箱调用。例如:
- Character c = 'X'; switch(c) → 实际执行的是 switch(c.charValue())
- 若传入 null,运行时会抛出 NullPointerException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











