Java switch case 表示最终字段为 "Constant expression required"

Java swith case says "Constant expression required" for final field

此代码引发错误

"Constant expression required" ponting to "INTEGER_CLASS_STRING".

它是一个最终变量,尽管它是一个常量。为什么会出现此错误?

我的代码如下:

private static final String INTEGER_CLASS_STRING = Integer.class.toString();
private static final String DOUBLE_CLASS_STRING = Double.class.toString();

 switch (definition.get(correctKey).getClass().toString()){
    case INTEGER_CLASS_STRING: System.out.println();
    case DOUBLE_CLASS_STRING: System.out.println();
 }

这对于 switch 语句是不可能的。 Java 中的 switch 语句比大多数人知道的更受限制。评论所暗示的是真实的——你的常量不是 "constant enough"。 它们可能是最终的,但它们在程序启动时被初始化。 Java 要求开关标签在编译时已知。

最简单的解决方案是使用 if-else-if,我会直接使用 class 进行比较,而不是明智地比较名称字符:

Class<?> def = definition.get(correctKey).getClass();
if (Integer.class.equals(def)) {
  // your code
} else if (Double.class.equals(def)) {
  // double code
} else {
  // Error, not found
}

如果您"need"要使用开关,则必须使用您的常量定义一个枚举,以及一​​个将您的输入映射到枚举常量的函数。

知道你想要达到的目标会很有趣,也许完全有另一种解决方案。