我有一个在交换机案例中使用常量的两个java片段:
final Integer s1=5;
int x=5;
switch(x){
case s1: **<== causes complilation error..**
System.out.println("hello");
}
下面的代码工作正常,因为s1
被视为常量,而上面的代码不起作用。
final int s1=5;
int x=5;
switch(x){
case s1: <=== ok s1 is constant
System.out.println("hello");
}
上述两个声明之间有什么区别?
答案 0 :(得分:3)
Java语言规范defines:
SwitchLabel:
- case ConstantExpression:
- case EnumConstantName:
- 默认:
也就是说,case标签必须是枚举常量的名称,或者是ConstantExpression。规范还says:
常量表达式是表示基本类型值的表达式或不突然完成的字符串,仅使用以下内容组成:
也就是说,Integer
不是编译类型常量表达式,因此不能用作案例标签。
答案 1 :(得分:2)
switch
语句仅适用于基本类型以及String
和enum
。 Integer
既不是原始类型,也不是String
或enum
,因此它会产生编译错误。