Warum erfordern Java's +=, -=, *=, /= zusammengesetzte Zuweisungsoperatoren kein Casting?

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)?

Lösung

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 zu E1 = (T)((E1) op (E2)), wobei T der Typ von E1 ist, mit der Ausnahme, dass E1 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.

Kommentare (12)

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);

Kommentare (4)

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.

Kommentare (1)