Operatora „+” nie można zastosować do obiektu i ciągu

12

Poniższy kod:

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

    [...]
}

kompiluje się bez błędów w JDK 8 (przy użyciu -source 1.6), ale kończy się niepowodzeniem w JDK 6 z komunikatem o błędzie:

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

Rozumiem, o co chodzi w tym błędzie, ale dlaczego kompiluje się z JDK 8? Czy jest to gdziekolwiek udokumentowane?

Grodriguez
źródło
Myślę, że wartość nie musi być ciągiem. Jeśli wartość jest liczbą całkowitą, nie ma sensu dodawać do niej łańcucha. Żegnaj, możesz spróbować rzucić wartość na ciąg
fedoraHacker
2
@fedoraHacker Wyrażenie value = value + suffixjest całkowicie legalne, niezależnie od rodzaju wartości. Wydaje mi się, że value += suffixpowinno to być również legalne.
Grodriguez
wow, nie miałem pojęcia. Myślałem, że celem różnych obiektów jest zdefiniowanie reguł dotyczących tego, co dane mogą, a czego nie mogą zrobić. Głównym celem posiadania różnych typów danych i obiektów jest rozdzielenie odpowiedzialności, aby upewnić się, że typy wykonują jedną rzecz, ale robią to dobrze. Jestem po prostu zaskoczony, że możesz mieszać takie typy danych. Cóż, uczysz się czegoś codziennie :) a wartość = wartość + przyrostek jest dokładnie taki sam jak wartość + = przyrostek, więc w ogóle nie kwestionuję składni
fedoraHacker
1
Tak, ale typ String jest nieco wyjątkowy. Operator + jest tutaj „operatorem konkatenacji łańcuchów”; jeśli tylko jeden z operandów jest ciągiem, drugi jest konwertowany na ciąg przed obliczeniem wyrażenia. Zobacz tę sekcję JLS .
Grodriguez
Ach, rozumiem, nie wiedziałem, że string tak to przekształcił. Dziękujemy za poświęcenie czasu na udzielenie odpowiedzi nawet po udzieleniu odpowiedzi na pytanie!
fedoraHacker

Odpowiedzi:

16

JLS 15.26.2. Operatorzy przypisań złożonych :

Wyrażenie przypisania złożonego formularza E1 op= E2jest równoważne E1 = (T) ((E1) op (E2)), gdzie Tjest typem E1, z tym że E1jest oceniane tylko raz.

To zdanie jest takie samo od Javy 6 do Javy 14 i prawdopodobnie nigdy się nie zmieniło od początku Javy.

Więc value += suffixto samo covalue = (Object) (value + suffix)

Kompilator Java 6 nie powinien był skompilować tej instrukcji.

Andreas
źródło
2
Błąd JDK (javac). Dziękuję za wskaźnik do JLS, jakoś mi tego brakowało.
Grodriguez
3
15.18.1. Operator konkatenacji ciągów + jest również istotny w celu wyjaśnienia, dlaczego value = (Object) (value + suffix)należy skompilować równoważne wyrażenie .
Dukeling