Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8:class.getName()和字符串文字之间的差异_Java_Switch Statement_Java 8_Constants_String Literals - Fatal编程技术网

Java8:class.getName()和字符串文字之间的差异

Java8:class.getName()和字符串文字之间的差异,java,switch-statement,java-8,constants,string-literals,Java,Switch Statement,Java 8,Constants,String Literals,我在做开关箱 如果我们使用class.getName(),那么,我得到的错误是“case表达式必须是常量表达式”,如下所示: switch(param.getClass().getName()) { case String.class.getName(): // to do break; } 即使我们执行以下操作,在常量中使用字符串类名,也会得到相同的错误: public static final String P

我在做开关箱

如果我们使用class.getName(),那么,我得到的错误是“case表达式必须是常量表达式”,如下所示:

switch(param.getClass().getName())
    {
        case String.class.getName():
            // to do
            break;
    }
即使我们执行以下操作,在常量中使用字符串类名,也会得到相同的错误:

public static final String PARAM_NAME = String.class.getName();
switch(param.getClass().getName())
    {
        case PARAM_NAME:
            // to do
            break;
    }
但是,如果我执行以下操作,使用字符串文字“java.lang.string”,则不会出现错误:

public static final String PARAM_NAME = "java.lang.String";
谁能解释一下,为什么不先拿前两个,再拿最后一个?提前感谢。

classObject.getName()是一个方法调用,根据定义,方法调用的结果不是编译时常量。字符串文字是编译时常量


请注意,虽然在许多情况下,
静态final
引用可以在程序的生命周期内作为常量,但
开关必须在编译时对其选项进行硬编码。
case
目标的值必须是枚举值或(编译时)。

每个case标签必须是“常量表达式”。Java语言标准中定义了什么是“常量表达式”:

编译时常量表达式是一个表示原语类型的值或字符串的表达式,该值或字符串不会突然完成,并且仅使用以下内容组成:

  • 基元类型的文字和字符串类型的文字

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

此处未列出任何方法调用,因此即使方法很普通,方法调用结果也不能是常量表达式。但是这里列出了“引用常量变量的简单名称”,因此对常量变量的引用也是常量。

这不起作用的原因是需要在编译时知道要打开的
大小写的值(因为它是硬编码的,并且内联在字节码中)

String.class.getName()
是一个在运行时进行计算的方法调用。是的,
static final
保证它在类最初加载后不会更改。但所有这些都是在编译时间之后很久的事情


编译器从不从应用程序源代码调用任何代码(注释处理可能除外)。它只编译它

但是,我也在“static final”(即常量)变量中使用它,那么,它也不使用它吗?编译器做了一些神奇的事情,我假设这两件事被编译成完全相同的字节码。最后一次给出时,将使用字符串文字,因此works@KrishnaKumar
static final
字段不一定是编译时常量,即使出于实际目的,它在运行时是常量。
final
变量是编译时常量,当且仅当:,它立即用编译时常量初始化。请注意,它不必是静态的,甚至不必是字段,规则也适用于局部变量。