【问题标题】:Difference between constant declarations常量声明之间的区别
【发布时间】:2014-12-18 03:59:11
【问题描述】:

我有两个 java sn-ps 在 switch case 中使用常量:

final Integer s1=5;
int x=5;
switch(x){
    case s1:  **<== causes complilation error..**
        System.out.println("hello");
}

下面的代码可以正常工作,因为s1 被视为常量,而上面的代码不起作用。

final int s1=5;
int x=5;
switch(x){
    case s1: <=== ok s1 is constant
        System.out.println("hello");
}

以上两种声明有什么区别?

【问题讨论】:

  • 非常接近,但不完全重复:stackoverflow.com/questions/4401743/…(此处也适用答案)
  • 我不明白问题是什么。好的,您已经看到其中一个有效,而另一个无效。你知道他们之间有什么区别。你到底在问什么?
  • @DavidWallace 我认为这是一个合理的问题。他在问为什么不能将 final Integer 视为 switch 语句中的常量表达式。我想答案是语言设计者可以很容易地完成这项工作,但它会使常量表达式的定义变得复杂,没有充分的理由。
  • @pbabcdefp 好的。所以这是一个“设计师为什么要这样做”的问题。我现在知道了。就个人而言,我不喜欢这样的问题,因为在大多数情况下,它们只能由 Java 的设计者来回答;而且我不确定他们是否真的在 Stack Overflow 上闲逛。但我同意,这里没有人可以回答这个问题并不能使它成为一个不合理的问题。我觉得两个人已经尝试过很有趣,而且毫无疑问还会有更多人尝试。

标签: java


【解决方案1】:

Java 语言规范defines

开关标签:

  • 案例常量表达式:
  • 案例 EnumConstantName :
  • 默认:

也就是说,case 标签必须是枚举常量的名称,或者是一个 ConstantExpression。规范还says:

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

也就是说,Integer 不是编译类型常量表达式,因此不能用作 case 标签。

【讨论】:

    【解决方案2】:

    switch 语句仅适用于原始类型和Strings 和enums。 Integer 既不是原始类型,也不是Stringenum,因此会产生编译错误。

    【讨论】:

    • 嗯...但是你可以“切换”一个整数,不是吗(只是不是“大小写”)?
    • 我认为这更像是错误所说的:使用 Integer 它不被视为“常量表达式”。与“switch”直接无关。
    • 这是一个有趣的问题。为什么自动拆箱在这里不起作用?
    • @pbabcdefp 哎呀,忘了这些。已编辑
    • 是的,Switch 采用原始和枚举,它不适用于对象。
    猜你喜欢
    • 2015-07-29
    • 2020-04-20
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2011-09-20
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多