由于各种商业原因,我想在我的一个类中保留一些静态ID。它们最初是int
,但我想将它们更改为Integer
,因此我可以对它们做一个等号(即MY_ID.equals(..)
,以避免NPE)
当我将它们更改为Integer时,我的switch语句中出现错误。 docs表示在Switch中Integer应该没问题。
引用
[Switch]也适用于枚举类型(在枚举类型中讨论), String类,以及一些特定的包装类 原始类型:字符,字节,短整数和整数(在 数字和字符串)。
在下面的代码中,如果我是int
,那么它就会编译。当它是Integer
时,它不会说constant expression is required
。我尝试过做.intValue()
,但这也不起作用。
我真的很蠢吗?或完全误读docs?
private static final Integer i = 1;
@Test
public void test() {
switch(mObj.getId()){
case i: //do something
default: //do something default
}
}
感谢您的任何指示。暂时我将它们保持为int
并执行new Integer(myint).equals(...)
答案 0 :(得分:8)
将常量更改为基本类型:
private static final int i = 1;
你会没事的。 switch
只能使用基元,枚举值和(自Java 7开始)字符串。几点提示:
new Integer(myint).equals(...)
可能是超级丰富的。如果至少有一个变量是原始的,只需执行:myint == ...
。只有在与equals()
包装器进行比较时才需要Integer
。
首选Integer.valueOf(myInt)
代替new Integer(myInt)
- 并尽可能依靠自动装箱。
常量通常使用Java中的大写情况编写,因此static final int I = 1
。
答案 1 :(得分:3)
在case
语句或枚举常量中切换require constant expressions。 A constant expression is:
表示基本类型值的表达式或不突然完成的字符串
所以整数没有资格。在您的情况下,您可以使用int
或枚举(如果您的ID在编译时已知,则会有意义。)
唯一可以使用盒装类型的地方(例如整数)在switch表达式中:
switch(Integer.valueOf(1)) {
case 1: //
}
答案 2 :(得分:3)
现在java提供了枚举,我们通常这样做:
public enum MyKey {
i,
j
}
...
switch(mObj.getId()){
case i: //do something
default: //do something default
}
答案 3 :(得分:0)
您必须在switch语句中使用常量值。
switch(mObj.getId()){
case 5: //do something
default: //do something default
}
答案 4 :(得分:0)
在显示的代码中,'i'是一个对象指针,而不是一个常量表达式。
答案 5 :(得分:0)
因为我在看这个......
接受的答案是:
switch只能用于原语,枚举值和(自Java 7起) 字符串
然而,
概述了显示的开关的JavaSE7文档:
Expression的类型必须是char,byte,short,int, Character,Byte, Short,Integer ,String或枚举类型(第8.9节),或编译时错误 发生。
我只想澄清未来的冲浪者。