运算符“+”不能应用于对象和字符串

Gro*_*uez 11 java javac java-6 java-8

以下代码:

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

    [...]
}
Run Code Online (Sandbox Code Playgroud)

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

Operator '+' cannot be applied to java.lang.Object and java.lang.String
Run Code Online (Sandbox Code Playgroud)

虽然我确实理解错误是关于什么的,但为什么使用 JDK 8 进行编译?这在任何地方都有记录吗?

And*_*eas 14

JLS 15.26.2。复合赋值运算符指出:

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

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

所以value += suffix是一样的value = (Object) (value + suffix)

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

  • [15.18.1。字符串连接运算符 +](https://docs.oracle.com/javase/specs/jls/se14/html/jls-15.html#jls-15.18.1) 也与解释为什么 `value 的等效语句有关= (对象) (值 + 后缀)` 应该可以编译。 (3认同)
  • 那么 JDK (javac) 就会出现 bug。谢谢你指点 JLS,不知何故我错过了。 (2认同)