L'operatore '+' non può essere applicato a oggetto e stringa


12

Il seguente codice:

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

    [...]
}

compila senza errori in JDK 8 (usando -source 1.6), ma fallisce in JDK 6 con il messaggio di errore:

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

Mentre capisco di cosa si tratta l'errore, perché questo viene compilato con JDK 8? Questo è documentato ovunque?


Immagino che il valore non debba essere String. Se value è un numero intero, allora non ha senso aggiungere una stringa ad esso. Forse puoi provare a lanciare valore su stringa
fedoraHacker il

2
@fedoraHacker L'espressione value = value + suffixè completamente legale indipendentemente dal tipo di valore. Quindi mi sembra che value += suffixdovrebbe essere anche legale.
Grodriguez,

wow, non ne avevo idea. Ho pensato che il punto centrale di diversi oggetti fosse definire regole per ciò che i dati possono e non possono fare. Il punto centrale di avere tipi di dati e oggetti diversi è quello di separare la responsabilità per assicurarsi che i tipi facciano una cosa, ma lo faccia bene. Sono solo sconcertato dal fatto che tu possa mescolare tipi di dati del genere. Bene, impari qualcosa ogni giorno :) e Value = value + suffix è esattamente uguale a value + = suffix, quindi non
disputo

1
Sì, ma il tipo di stringa è in qualche modo speciale. L'operatore + qui è "l'operatore di concatenazione di stringhe"; se solo uno degli operandi è una stringa, l'altro viene convertito in una stringa prima che l'espressione venga valutata. Vedi questa sezione di JLS .
Grodriguez,

Ah, vedo, non sapevo che la stringa l'avesse convertita in quel modo. Grazie per aver dedicato del tempo a rispondere anche dopo aver risposto alla domanda!
fedoraHacker

Risposte:


16

JLS 15.26.2. Gli operatori di assegnazione composti dichiarano:

Un'espressione di assegnazione composta del modulo E1 op= E2è equivalente a E1 = (T) ((E1) op (E2)), dov'è Til tipo di E1, tranne che E1viene valutata una sola volta.

Questa frase è la stessa da Java 6 a Java 14 e probabilmente non è mai cambiata dall'inizio di Java.

Quindi value += suffixè lo stesso divalue = (Object) (value + suffix)

Il compilatore Java 6 non avrebbe dovuto fallire nel compilare quell'istruzione.


2
Quindi il bug JDK (javac). Grazie per il puntatore a JLS, in qualche modo mi è mancato.
Grodriguez,

3
15.18.1. String Concatenation Operator + è anche rilevante per spiegare perché value = (Object) (value + suffix)compilare la dichiarazione equivalente di .
Dukeling,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.