具有三元运算符的Java SE 11字符串最终变量在切换案例表达式中不算作常量变量

问题描述

我遇到了以下代码不起作用的问题。我在 Java SE 11(11.0.8),Eclipse 2020-06,Windows 10 中运行了代码


通过三元运算符使用字符串最终变量:不起作用

public class Tester {
    public static void main(String[] args) {
        
        String switchVar = "abc";
        final String caseStr = true ? "abc" : "def";    
        switch (switchVar) {
            case caseStr: System.out.println("Doesn't work");
        }
    }
}

它有一个编译时错误java.lang.Error: Unresolved compilation problem: case expressions must be constant expressions


但是,根据JLS §4.12.4JLS §15.28,String类型可以是最终变量,三元运算符也可以算作常量表达式。

常量变量是原始类型或类型 String 的最终变量,并使用常量表达式进行了初始化。

常量表达式是表示原始类型或String的值的表达式,该值不会突然完成,并且仅使用以下内容组成:

...

  • 三元条件运算符? :

  • 引用常量变量的简单名称


我进行了更多测试,结果表明,如果不将这些要点结合在一起,它们中的任何一个都可以工作。

直接使用常量表达式作为大小写常量:没问题

public class Tester {
    public static void main(String[] args) {
        
        String switchVar = "abc";
        switch (switchVar) {
            case true ? "abc" : "def": System.out.println("works");
        }
    }
}

使用不带三元运算符的String常量变量:没问题

public class Tester {
    public static void main(String[] args) {
        
        String switchVar = "abc";
        
        final String VAR_A = "a";
        final String VAR_BC = "bc";
        final String CASE = VAR_A + VAR_BC;
        
        switch (switchVar) {
            case CASE : System.out.println("works");
        }
    }
}

将int与三元运算符而不是字符串一起使用:没问题

public class Tester {
    public static void main(String[] args) {
        
        int switchVar = 10;
        final int CASE = 3 > 2 ? 10 : 0;
        
        switch (switchVar) {
            case CASE : System.out.println("works");
        }
    }
}

有人可以帮我吗?

解决方法

在其他人的友好帮助下,现在可以确定这是一个月食的bug。

我已将该错误报告为蚀。 (Bugzilla – Bug 566332