Der Operator '+' kann nicht auf Objekt und Zeichenfolge angewendet werden

12

Der folgende Code:

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

    [...]
}

Kompiliert fehlerfrei in JDK 8 (mit -source 1.6), schlägt jedoch in JDK 6 mit der Fehlermeldung fehl:

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

Obwohl ich verstehe, worum es bei dem Fehler geht, warum wird dies mit JDK 8 kompiliert? Ist das irgendwo dokumentiert?

Grodriguez
quelle
Ich denke, der Wert muss nicht String sein. Wenn value eine Ganzzahl ist, ist es nicht sinnvoll, eine Zeichenfolge hinzuzufügen. Vielleicht können Sie versuchen, den Wert in string
fedoraHacker zu übertragen.
2
@fedoraHacker Der Ausdruck value = value + suffixist unabhängig von der Art des Werts völlig legal. Es scheint mir value += suffixalso auch legal zu sein.
Grodriguez
Wow, ich hatte keine Ahnung. Ich dachte, dass der springende Punkt bei verschiedenen Objekten darin besteht, Regeln dafür zu definieren, was die Daten können und was nicht. Der springende Punkt bei unterschiedlichen Datentypen und Objekten ist die Trennung der Verantwortung, um sicherzustellen, dass Typen eine Sache tun, aber es gut machen. Ich bin nur verblüfft, dass Sie solche Datentypen mischen können. Nun, du lernst jeden Tag etwas :) und Wert = Wert + Suffix ist genau das gleiche wie Wert + = Suffix, also bestreite ich die Syntax überhaupt nicht
fedoraHacker
1
Ja, aber der String-Typ ist etwas Besonderes. Der Operator + ist hier der "String-Verkettungsoperator". Wenn nur einer der Operanden eine Zeichenfolge ist, wird der andere in eine Zeichenfolge konvertiert, bevor der Ausdruck ausgewertet wird. Siehe diesen Abschnitt des JLS .
Grodriguez
Ah, ich verstehe, wusste nicht, dass String es so konvertiert hat. Vielen Dank, dass Sie sich die Zeit genommen haben, auch nach Beantwortung der Frage zu antworten!
fedoraHacker

Antworten:

16

JLS 15.26.2. Compound Assignment Operators gibt an:

Eine Verbindung Zuweisungsausdruck von der Form E1 op= E2entspricht E1 = (T) ((E1) op (E2)), in dem Tdie Art der E1Ausnahme , dass E1nur einmal ausgewertet wird.

Dieser Satz ist von Java 6 bis Java 14 derselbe und hat sich seit Beginn von Java wahrscheinlich nie geändert.

So value += suffixist das gleiche wievalue = (Object) (value + suffix)

Der Java 6-Compiler sollte diese Anweisung nicht fehlschlagen können.

Andreas
quelle
2
JDK (javac) Fehler dann. Vielen Dank für den Hinweis auf die JLS, irgendwie habe ich das verpasst.
Grodriguez
3
15.18.1. Der String Concatenation Operator + ist auch relevant, um zu erklären, warum die entsprechende Anweisung von value = (Object) (value + suffix)kompiliert werden sollte.
Dukeling