使用规则如下case:
case
case表达式必须计算为Compile Time Constant。
Compile Time Constant
case(t)表达式必须与switch(t)具有相同的类型,其中t是类型(字符串)。
如果我运行此代码:
public static void main(String[] args) { final String s=new String("abc"); switch(s) { case (s):System.out.println("hi"); } }
它给出Compile-error为:"case expression must be a constant expression" 另一方面,如果我尝试使用final String s="abc";,它可以正常工作。
"case expression must be a constant expression"
final String s="abc";
据我所知,String s=new String("abc") 是对String位于堆上的对象的引用。并且s它本身是一个编译时常量。
String s=new String("abc")
String
s
这是否意味着final String s=new String("abc");不是编译时间常数?
final String s=new String("abc");
用这个,
String s= new String("abc"); final String lm = "abc"; switch(s) { case lm: case "abc": //This is more precise as per the comments System.out.println("hi"); break; }
根据文档
基本类型或String类型的变量是最终变量,并使用编译时常量表达式(第15.28节)进行了初始化,该变量称为常量变量
问题是您的代码final String s= new String("abc");未初始化常量变量。
final String s= new String("abc");