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


12

如下代码:

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进行编译?这在任何地方都有记录吗?


我猜值不一定是String。如果value是一个Integer,那么我就没有必要添加一个字符串了。Maybye,您可以尝试将值转换为字符串
fedoraHacker,

2
@fedoraHacker value = value + suffix无论值的类型如何,表达式 都是完全合法的。所以在我看来,这也value += suffix应该合法。
Grodriguez

哇,我不知道 我认为,不同对象的全部目的是为数据可以做什么和不能做什么定义规则。具有不同的数据类型和对象的全部目的是分离责任,以确保类型能够做一件事,但要做好。我感到困惑的是,您可以混合这样的数据类型。好吧,您每天都会学到一些东西:)和值=值+后缀与值+ =后缀完全相同,所以我完全不质疑语法
fedoraHacker

1
是的,但是String类型有些特殊。这里的+运算符是“字符串串联运算符”;如果只有一个操作数是字符串,则在对表达式求值之前,另一个将转换为字符串。请参阅JLS的本部分
Grodriguez

啊,我明白了,不知道字符串是那样转换的。感谢您抽出宝贵的时间回答问题,即使问题已经解决!
fedoraHacker

Answers:


16

JLS 15.26.2。复合分配运算符指出:

形式的复合赋值表达式E1 op= E2等效于E1 = (T) ((E1) op (E2)),其中T是的类型E1,不同之处在于该表达式E1仅被评估一次。

Java 6Java 14,这句话是相同的,并且自Java诞生以来就从未改变过。

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

Java 6编译器应该不会编译该语句失败。


2
然后是JDK(javac)错误。感谢您指向JLS的指针,以某种方式我错过了。
Grodriguez

3
15.18.1。字符串连接运算符+也与解释为什么value = (Object) (value + suffix)要编译等效语句有关。
Dukeling
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.