如何解决具有三元运算符的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.4和JLS §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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。