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

11

以下代码:

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

    [...]
}

使用-source 1.6在JDK 8中可以无错误编译,但在JDK 6中会出现以下错误信息:

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

虽然我理解错误的原因,但为什么这可以在JDK 8中编译?有没有任何文档可供参考?


我猜值不一定是字符串。如果值是整数,那么将字符串添加到它上面就没有意义了。也许你可以尝试将值转换为字符串。 - fedoraHacker
2
@fedoraHacker 表达式 value = value + suffix 是完全合法的,无论值的类型如何。因此,在我看来,value += suffix 也应该是合法的。 - Grodriguez
哇,我真的不知道。我以为不同对象的整个意义就是定义数据可以和不能做什么规则。拥有不同数据类型和对象的整个意义在于分离责任,以确保类型只做一件事情,但做得很好。我只是感到困惑,你居然可以混合使用不同的数据类型。好吧,每天都会学到新东西 :) 而且 Value = value + suffix 和 value += suffix 是完全相同的,所以我不对语法提出异议。 - fedoraHacker
1
是的,但String类型有些特殊。这里的+运算符是“字符串连接运算符”; 如果操作数中只有一个是字符串,则在计算表达式之前将另一个操作数转换为字符串。请参见JLS的此部分 - Grodriguez
啊,我明白了,没想到字符串会转换成那样。感谢您抽出时间回复,即使问题已经得到解答! - fedoraHacker
1个回答

14
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编译器不应该无法编译该语句。

2
JDK(javac)有一个bug。谢谢你指向JLS,我不知怎么错过了它。 - Grodriguez
3
15.18.1. 字符串连接运算符 +也可以解释为什么value = (Object) (value + suffix)的等效语句应该编译。这与IT有关。 - Bernhard Barker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接