【问题标题】:Operator '+' cannot be applied to Object and String运算符“+”不能应用于对象和字符串
【发布时间】:2020-04-15 15:14:07
【问题描述】:

以下代码:

void someMethod(Object value)
{
    String suffix = getSuffix();
    if (suffix != null)
        value += suffix;

    [...]
}

在 JDK 8 中编译没有错误(使用 -source 1.6),但在 JDK 6 中失败并显示错误消息:

Operator '+' cannot be applied to java.lang.Object and java.lang.String

虽然我确实了解错误的含义,但为什么要使用 JDK 8 编译?这在任何地方都有记录吗?

【问题讨论】:

  • 我猜值不一定是字符串。如果 value 是一个 Integer ,那么向它添加一个字符串是没有意义的。也许你可以尝试将值转换为字符串
  • @fedoraHacker 表达式value = value + suffix 是完全合法的,与值的类型无关。所以在我看来value += suffix 也应该是合法的。
  • 哇,我不知道。我认为不同对象的全部意义在于定义数据可以做什么和不能做什么的规则。拥有不同数据类型和对象的全部意义在于分离责任以确保类型只做一件事,但做得很好。我只是对您可以混合这样的数据类型感到困惑。好吧,你每天都会学到一些东西 :) 并且 Value = value + suffix 与 value += suffix 完全一样,所以我根本不质疑语法
  • 是的,但是 String 类型有些特殊。这里的 + 运算符是“字符串连接运算符”;如果只有一个操作数是字符串,则在计算表达式之前将另一个操作数转换为字符串。见this section of the JLS
  • 啊,我明白了,不知道字符串是这样转换的。感谢您在问题得到解答后仍抽出时间回复!

标签: java java-8 javac java-6


【解决方案1】:

JLS 15.26.2. Compound Assignment Operators 声明:

E1 op= E2 形式的复合赋值表达式等价于E1 = (T) ((E1) op (E2)),其中TE1 的类型,但E1 只计算一次。

这句话从Java 6Java 14 都是一样的,而且自Java 诞生以来可能从未改变过。

所以value += suffixvalue = (Object) (value + suffix) 相同

Java 6 编译器不应该无法编译该语句。

【讨论】:

  • JDK (javac) 错误。感谢您提供指向 JLS 的指针,不知何故我错过了。
  • 15.18.1. String Concatenation Operator + 也有助于解释为什么 value = (Object) (value + suffix) 的等效语句应该编译。
猜你喜欢
  • 2017-10-12
  • 2016-06-30
  • 2015-04-19
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
相关资源
最近更新 更多