【问题标题】:Java swith case says "Constant expression required" for final field [duplicate]Java switch case 对 final 字段说“需要常量表达式”[重复]
【发布时间】:2020-06-16 15:32:18
【问题描述】:

此代码抛出错误

“需要常量表达式”指向“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 语句需要一个编译时间常数——你引用的是一个函数toString。看看这个更详细的答案stackoverflow.com/a/3827424/1538039
  • 我没有,因为答案是让变量“最终”,我已经做了

标签: java switch-statement final


【解决方案1】:

这对于 switch 语句是不可能的。 Java 中的 switch 语句比大多数人都知道的更受限制。 cmets 的建议是正确的-您的常数不够“恒定”。 它们可能是最终的,但它们在程序启动时被初始化。 Java 要求在编译时就知道开关标签。

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

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
}

如果您“需要”使用开关,则必须使用常量定义一个 Enum,并定义一个将输入映射到枚举常量的函数。

知道你想要实现什么会很有趣,也许还有另一种解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    相关资源
    最近更新 更多