Bis heute dachte ich, dass zum Beispiel:
i += j;
nur eine Abkürzung für ist:
i = i + j;
Aber wenn wir dies versuchen:
int i = 5;
long j = 8;
Dann wird i = i + j;
nicht kompiliert, aber i += j;
wird gut kompiliert.
Bedeutet das, dass i += j;
in Wirklichkeit eine Abkürzung für etwas wie dieses ist
i = (Typ von i) (i + j)
?
Wie immer bei diesen Fragen gibt das JLS die Antwort. In diesem Fall §15.26.2 Zusammengesetzte Zuweisungsoperatoren. Ein Auszug:
Ein zusammengesetzter Zuweisungsausdruck der Form
E1 op= E2
ist äquivalent zuE1 = (T)((E1) op (E2))
, wobeiT
der Typ vonE1
ist, mit der Ausnahme, dassE1
nur einmal ausgewertet wird.
Ein Beispiel zitiert aus §15.26.2
[...] ist der folgende Code korrekt:
short x = 3; x += 4.6;
und führt dazu, dass x den Wert 7 hat, weil es äquivalent ist zu:
short x = 3; x = (short)(x + 4,6);
Mit anderen Worten: Ihre Annahme ist richtig.
Sehr gute Frage. Die Java Language specification bestätigt Ihren Vorschlag.
Zum Beispiel ist der folgende Code korrekt:
short x = 3; x += 4.6;
und führt dazu, dass x den Wert 7 hat, weil es äquivalent ist zu:
short x = 3; x = (kurz)(x + 4,6);
Sie müssen im Fall von "i = i + l" explizit von "long" in "int" umwandeln, damit es kompiliert wird und eine korrekte Ausgabe erfolgt.
i = i + (int)l;
oder
i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.
aber im Fall von +=
funktioniert es einfach, weil der Operator implizit die Typumwandlung vom Typ der rechten Variable zum Typ der linken Variable vornimmt, so dass keine explizite Umwandlung erforderlich ist.