【问题标题】:Wrappers in switch statementswitch 语句中的包装器
【发布时间】:2014-11-10 18:16:33
【问题描述】:

我对 switch 语句中的对象有疑问。 我知道 case 子句中使用的变量必须是最终的(否则我们会得到:“case 表达式必须是常量表达式”)。 对象上的final意味着只有引用不能改变,值仍然可以被其他非最终引用改变,因此,我们不能在'case'中使用对象。
但是为什么我们不能使用包装器呢?它们是不可变的不是吗?

java代码:

    Integer i = 8;
    final int x = 10;

    switch ( x )
    {
    case x:
        System.out.println("x");
        break;
    case i:             
        System.out.println("i");
        break;
    }

【问题讨论】:

  • 这是什么语言?看起来像是 Java,但我不确定。
  • 它说 Java 所以它可能是 ;-)
  • 在这种情况下你对“Wrapper”的理解是什么?你能给我们举个例子吗?

标签: java switch-statement wrapper


【解决方案1】:

您的变量 i 是对 Integer 对象的引用。

Integer 对象是不可变的。

变量i 本身就是一个对象的可变引用。它不是常量变量,它必须是final的,并且是原始类型或String类型。

编辑: 终于在 Java 语言规范中找到了参考资料。

首先,根据14.11: The switch statement,开关标签可以包含枚举或常量表达式

SwitchLabel:
case ConstantExpression : 
case EnumConstantName : 
default :

15.28: Constant expressions 中定义了一个常量表达式。本案例中的相关项是:

引用常量变量(第 4.12.4 节)的简单名称(第 6.5.6.1 节)。

常量变量由4.12.4: final variables定义

常量变量是原始类型或 String 类型的最终变量,使用常量表达式(第 15.28 节)进行初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2013-03-15
    • 2017-02-18
    • 2013-09-24
    • 2019-06-01
    • 1970-01-01
    相关资源
    最近更新 更多