L'opérateur «+» ne peut pas être appliqué à l'objet et à la chaîne

12

Le code suivant:

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

    [...]
}

se compile sans erreurs dans JDK 8 (en utilisant -source 1.6), mais échoue dans JDK 6 avec le message d'erreur:

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

Bien que je comprenne de quoi s'agit l'erreur, pourquoi cela se compile-t-il avec JDK 8? Est-ce documenté quelque part?

Grodriguez
la source
Je suppose que la valeur ne doit pas nécessairement être String. Si la valeur est un entier, je n'ai pas de sens d'y ajouter une chaîne. Maybye, vous pouvez essayer de convertir la valeur en chaîne
fedoraHacker
2
@fedoraHacker L'expression value = value + suffixest totalement légale quel que soit le type de valeur. Il me semble donc que cela value += suffixdevrait aussi être légal.
Grodriguez
wow, je n'en avais aucune idée. Je pensais que l'intérêt des différents objets était de définir des règles pour ce que les données peuvent et ne peuvent pas faire. L'intérêt d'avoir différents types de données et objets est de séparer la responsabilité de s'assurer que les types font une chose, mais le font bien. Je suis simplement déconcerté que vous puissiez mélanger des types de données comme ça. Eh bien, vous apprenez quelque chose tous les jours :) et Value = value + suffix est exactement la même chose que value + = suffix, donc je ne conteste pas du tout la syntaxe
fedoraHacker
1
Oui, mais le type String est quelque peu spécial. L'opérateur + ici est "l'opérateur de concaténation de chaînes"; si un seul des opérandes est une chaîne, l'autre est converti en chaîne avant l'évaluation de l'expression. Voir cette section du JLS .
Grodriguez
Ah je vois, je ne savais pas que la chaîne l'avait convertie comme ça. Merci d'avoir pris le temps de répondre même après réponse à la question!
fedoraHacker

Réponses:

16

JLS 15.26.2. Les opérateurs d'affectation composée déclarent :

Une expression d'affectation composée du formulaire E1 op= E2est équivalente à E1 = (T) ((E1) op (E2)), où Test le type de E1, sauf qu'elle E1n'est évaluée qu'une seule fois.

Cette phrase est la même de Java 6 à Java 14 , et n'a probablement jamais changé depuis le début de Java.

C'est value += suffixla même chose quevalue = (Object) (value + suffix)

Le compilateur Java 6 n'aurait pas dû échouer à compiler cette instruction.

Andreas
la source
2
Bogue JDK (javac) alors. Merci pour le pointeur vers le JLS, en quelque sorte j'ai manqué cela.
Grodriguez
3
15.18.1. L'opérateur de concaténation de chaînes + est également pertinent pour expliquer pourquoi l'instruction équivalente de value = (Object) (value + suffix)devrait être compilée.
Dukeling