在Switch语句中使用Integer
出于各种商业原因,我想在我的一个类中保留一些静态ID。 它们最初是int
但我想将它们更改为Integer
所以我可以对它们做一个等号(即避免NPE的MY_ID.equals(..)
)
当我将它们更改为Integer时,我的switch语句中出现错误。 文档说Integer在Switch中应该没问题。
去引用
[Switch]也适用于枚举类型(在枚举类型中讨论),String类,以及一些包含某些基本类型的特殊类:Character,Byte,Short和Integer(在Numbers和Strings中讨论)。
在下面的代码中,如果我是一个int
那么它编译。 当它是一个Integer
它并不是说需要一个constant expression is required
。 我尝试过.intValue()
但这也不起作用。
我真的很蠢吗? 或完全误读文档 ?
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(...)
将常量更改为基本类型:
private static final int i = 1;
你会没事的 switch
只能用于原语,枚举值和(从Java 7开始)字符串。 几点提示:
-
new Integer(myint).equals(...)
可能是new Integer(myint).equals(...)
。 如果至少有一个变量是原始的,那么就这样做:myint == ...
只有在与Integer
包装器进行比较时才需要equals()
。 -
首选
Integer.valueOf(myInt)
而不是new Integer(myInt)
– 并尽可能依赖自动装箱。 -
常量通常使用Java中的大写情况编写,因此
static final int I = 1
。
既然java提供了枚举,我们通常会这样做:
public enum MyKey { i, j } ... switch(mObj.getId()){ case i: //do something default: //do something default }
Switch 需要在case
语句或枚举常量中使用常量表达式 。 常量表达式是 :
表示原始类型值的表达式或不突然完成的String
所以整数没有资格。 在您的情况下,您可以使用int
或枚举(如果您的ID在编译时已知,这将是有意义的)。
您可以在switch表达式中使用boxed类型(例如Integer)的唯一位置:
switch(Integer.valueOf(1)) { case 1: // }
您必须在switch语句中使用常量值。
switch(mObj.getId()){ case 5: //do something default: //do something default }
在显示的代码中,’i’是一个对象指针,而不是一个常量表达式。
因为我在看这个……
接受的答案说:
switch只能用于原语,枚举值和(从Java 7开始)字符串
然而,
14.11交换机声明
概述了交换机的JavaSE7文档,其中显示:
Expression的类型必须是char,byte,short,int, Character,Byte,Short,Integer ,String或枚举类型(第8.9节),否则会发生编译时错误。
我只想澄清未来的冲浪者。