3 回答

TA貢獻1818條經驗 獲得超8個贊
查看switch 語句的文檔,我們可以找到以下內容:
開關適用于 byte、short、char 和 int 原始數據類型。它還適用于枚舉類型(在 Enum Types 中討論)、String 類和一些包裝某些原始類型的特殊類:Character、Byte、Short 和 Integer(在 Numbers 和 Strings 中討論)。
起初這似乎很好,你的問題不應該存在。然而,該定義沒有提到這些包裝器可以在哪里使用,在哪里不可以使用。查看開關語句 (JLS) 的規范,我們發現開關具有以下形式:
1 開關表達式
SwitchStatement: switch ( Expression ) SwitchBlock
Expression
進一步解釋:
表達式的類型必須是 char、byte、short、int、Character、Byte、Short、Integer、String 或枚舉類型(第 8.9 節),否則會發生編譯時錯誤。
所以在這里,使用諸如Integer
. 編譯器將管理。
2 開關塊
開關塊可以分解為:
SwitchLabels BlockStatements
SwitchLabel
定義為:
SwitchLabel: case ConstantExpression : case EnumConstantName : default :
所以標簽只接受常量表達式或枚舉。如果我們現在看一下常量表達式的定義,我們會發現:
常量表達式是表示原始類型值或字符串的表達式...
當然,必須應用一些條件才能使原始類型成為常量(在此處列出),但在您的情況下,重要的部分是您必須使用原始類型或字符串。
獎金
包裝類和原始類型之間的交換稱為“自動裝箱或拆箱”(取決于方向)。根據文檔,拆箱發生在以下情況:
將包裝類型 (
Integer
) 的對象轉換為其對應的原始 (int
) 值稱為拆箱。Java 編譯器在包裝類的對象是以下情況時應用拆箱:
作為參數傳遞給需要相應原始類型的值的方法。
分配給相應原始類型的變量。
因此,似乎 Java 根本不是為了使 switch 語句按照您的意圖工作而進行所需的拆箱。
----------------------
TL;博士
對于 switch 表達式,您可以使用包裝類。但是,對于標簽,您只能使用原始類型:byte、short、char 和 int。

TA貢獻1946條經驗 獲得超4個贊
case 表達式必須是常量表達式,你可以使用enum常量值和更可讀的代碼更好,這里是 enum 的示例:
枚舉類:
public enum Numbers {
HIGH(3), // calls constructor with value 3
MEDIUM(2), // calls constructor with value 2
LOW(1) // calls constructor with value 1
; // semicolon needed when fields / methods fol
private final int levelCode;
Numbers(int levelCode) {
this.levelCode = levelCode;
}
public int getLevelCode() {
return this.levelCode;
}
}
為您提供主要方法:
public class Test {
public static void main(String[] args) {
switch (Numbers.HIGH) {
case HIGH:
System.out.println("hight");
break;
case MEDIUM:
System.out.println("medium");
break;
case LOW:
System.out.println("low");
break;
}
}
}

TA貢獻1877條經驗 獲得超1個贊
final
在 Java 中聲明的變量不被視為編譯時常量,因為它們的值仍然可以在運行時更改 - 從未定義狀態到已定義狀態。
案例值必須在現場定義,例如。case 5: case 12: case "green":
添加回答
舉報