11

出于各种商业原因,我想在我的一个类中保存一些静态 ID。它们最初是int,但我想将它们更改为Integer这样我可以对它们做一个 equals (即MY_ID.equals(..)避免 NPE)

当我将它们更改为 Integer 时,我的 switch 语句中出现错误。文档说 Integer 在 Switches 中应该没问题。

去引用

[Switch] 也适用于枚举类型(在 Enum Types 中讨论)、String 类和一些包装某些基本类型的特殊类:Character、Byte、Short 和 Integer(在 Numbers 和 Strings 中讨论)。

在我下面的代码中,如果 i 是 aint那么它会编译。当它是 a 时,Integer它不会说 a 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(...)

4

6 回答 6

10

将常量更改为原始类型:

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.

于 2012-09-26T14:22:00.917 回答
3

Switch需要语句中的常量表达式case或枚举常量。一个常量表达式是

表示原始类型值的表达式或未突然完成的字符串

所以整数不符合条件。在您的情况下,您可以使用一个int或一个枚举(如果您的 ID 在编译时已知,这将是有意义的)。

唯一可以使用盒装类型(例如 Integer)的地方是 switch 表达式:

switch(Integer.valueOf(1)) {
    case 1: //
}
于 2012-09-26T14:22:51.490 回答
3

既然 java 提供了枚举,我们通常会这样做:

public enum MyKey {
   i,
   j
}

...

switch(mObj.getId()){
    case i: //do something
    default: //do something default
}
于 2012-09-26T14:28:13.827 回答
1

因为我在看这个...

接受的答案说:

switch 只能使用原语、枚举值和(从 Java 7 开始)字符串

然而,

14.11 switch 语句

概述了 switch 的 JavaSE7 文档,其中显示:

表达式的类型必须是 char、byte、short、int、Character、Byte、Short、Integer、String 或枚举类型(第 8.9 节),否则会发生编译时错误。

我只是想为未来的冲浪者澄清一下。

于 2016-01-26T18:13:37.823 回答
0

您必须在 switch 语句中使用常量值。

switch(mObj.getId()){
    case 5: //do something
    default: //do something default
}
于 2012-09-26T14:27:43.687 回答
0

在显示的代码中,“i”是一个对象指针,而不是一个常量表达式。

于 2012-09-26T14:28:11.253 回答