El operador '+' no se puede aplicar a objetos y cadenas

12

El siguiente código:

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

    [...]
}

compila sin errores en JDK 8 (usando -source 1.6), pero falla en JDK 6 con el mensaje de error:

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

Si bien entiendo de qué se trata el error, ¿por qué esto se compila con JDK 8? ¿Está documentado en alguna parte?

Grodriguez
fuente
Supongo que el valor no tiene que ser String. Si el valor es un entero, no tiene sentido agregarle una cadena. Tal vez puedas intentar convertir el valor en una cadena
fedoraHacker
2
@fedoraHacker La expresión value = value + suffixes completamente legal independientemente del tipo de valor. Por lo tanto, me parece que también value += suffixdebería ser legal.
Grodriguez
wow, no tenía idea. Pensé que el objetivo de diferentes objetos era definir reglas para lo que los datos pueden y no pueden hacer. El objetivo de tener diferentes tipos de datos y objetos es segregar la responsabilidad para asegurarse de que los tipos hagan una cosa, pero lo hagan bien. Estoy desconcertado de que pueda mezclar tipos de datos como ese. Bueno, aprendes algo todos los días :) y Value = value + suffix es exactamente igual que value + = suffix, así que no cuestiono la sintaxis en absoluto
fedoraHacker
1
Sí, pero el tipo de cadena es algo especial. El operador + aquí es el "operador de concatenación de cadenas"; si solo uno de los operandos es una cadena, el otro se convierte en una cadena antes de evaluar la expresión. Vea esta sección de JLS .
Grodriguez
Ah, ya veo, no sabía que la cadena lo convertía así. ¡Gracias por tomarse el tiempo de responder incluso después de que la pregunta haya sido respondida!
fedoraHacker

Respuestas:

16

JLS 15.26.2. Los operadores de asignación compuesta declaran :

Una expresión de asignación compuesta de la forma E1 op= E2es equivalente a E1 = (T) ((E1) op (E2)), donde Tes el tipo de E1, excepto que E1se evalúa solo una vez.

Esa oración es la misma desde Java 6 hasta Java 14 , y probablemente nunca ha cambiado desde el comienzo de Java.

Entonces value += suffix es lo mismo quevalue = (Object) (value + suffix)

El compilador de Java 6 no debería haber fallado al compilar esa declaración.

Andreas
fuente
2
JDK (javac) error entonces. Gracias por el puntero al JLS, de alguna manera me perdí eso.
Grodriguez
3
15.18.1. El operador de concatenación de cadenas + también es relevante para explicar por qué value = (Object) (value + suffix)debe compilarse la declaración equivalente de .
Dukeling