public static final Integer SAMPLE = 100;
public static void doSomething(int errorCode) {
switch (errorCode) {
case SAMPLE:
// ...
break;
}
}
我需要持续表达。如果我将SAMPLE更改为int它将得到修复。为什么?
答案 0 :(得分:8)
语言规范的相关部分位于JLS Sec 14.11:
每个案例标签都有一个案例常量,可以是常量表达式,也可以是枚举常量的名称。
这解释了为什么你不能使用Integer
值:它不是constant expression,因为它是在运行时评估的。
修复方法是将case标签更改为具有常量表达式。要了解允许的类型,请参阅规范的相同部分:
- 与switch语句关联的每个case常量必须与switch语句的Expression(第5.2节)的类型兼容。
和
Expression的类型必须是char,byte,short,int,Character,Byte,Short,Integer,String或枚举类型(第8.9节),否则会发生编译时错误。
由于你不能拥有一个常量包装的基本类型(Character
,Byte
,Short
或Integer
:它们都是在运行时进行评估的),这意味着那个案例标签只能是:
char
byte
short
int
String
最简单的选择是将SAMPLE
的声明更改为:
public static final int SAMPLE = 100;
请注意,100位于保证缓存的Integer.valueOf
范围内,因此不需要将值声明为基元:在需要盒装值的情况下,从缓存中使用一个值。
答案 1 :(得分:4)
Switch只能使用一些基元(char,byte,short,int),枚举值和字符串。
将其更改为;
public static final int SAMPLE = 100;
答案 2 :(得分:1)
实际上switch
语句可以与Integer
一起使用。
来源:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
case
仅适用于常数值,例如原语和编译时字符串。
传递给case
语句的SAMPLE字段应该是原始类型。