在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节),否则会发生编译时错误。

我只想澄清未来的冲浪者。