O operador '+' não pode ser aplicado a Object e String

12

O código a seguir:

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

    [...]
}

compila sem erros no JDK 8 (usando -source 1.6), mas falha no JDK 6 com a mensagem de erro:

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

Embora eu entenda do que se trata o erro, por que isso é compilado com o JDK 8? Isso está documentado em algum lugar?

Grodriguez
fonte
Eu acho que o valor não precisa ser String. Se value for um Inteiro, então não faz sentido adicionar uma string a ele. Talvez você possa tentar converter valor para string
fedoraHacker
2
@fedoraHacker A expressão value = value + suffixé completamente legal, independentemente do tipo de valor. Parece-me value += suffixque também deveria ser legal.
Grodriguez 15/04
uau, eu não tinha ideia. Eu pensei que o objetivo de diferentes objetos era definir regras para o que os dados podem e não podem fazer. O objetivo de ter tipos de dados e objetos diferentes é segregar a responsabilidade para garantir que os tipos façam uma coisa, mas façam bem. Estou confuso que você possa misturar tipos de dados como esse. Bem, você aprende algo todos os dias :) e Valor = valor + sufixo é exatamente o mesmo que valor + = sufixo, então eu não
discuto
11
Sim, mas o tipo String é um pouco especial. O operador + aqui é o "operador de concatenação de cadeias"; se apenas um dos operandos for uma sequência, o outro será convertido em uma sequência antes que a expressão seja avaliada. Veja esta seção do JLS .
Grodriguez 15/04
Ah, entendo, não sabia que a string era convertida assim. Obrigado por reservar um tempo para responder, mesmo depois que a pergunta for respondida!
fedoraHacker 15/04

Respostas:

16

JLS 15.26.2. Os operadores de atribuição composta declaram:

Uma expressão de atribuição composta do formulário E1 op= E2é equivalente a E1 = (T) ((E1) op (E2)), onde Té o tipo de E1, exceto que E1é avaliada apenas uma vez.

Essa frase é a mesma do Java 6 para o Java 14 e provavelmente nunca mudou desde o início do Java.

Então value += suffixé o mesmo quevalue = (Object) (value + suffix)

O compilador Java 6 não deveria ter falhado ao compilar essa instrução.

Andreas
fonte
2
JDK (javac) bug então. Obrigado pelo ponteiro para o JLS, de alguma forma eu perdi isso.
Grodriguez 15/04
3
15.18.1 O operador de concatenação de cadeias + também é relevante para explicar por que a instrução equivalente de value = (Object) (value + suffix)deve compilar.
Dukeling 15/04