Java += mit implizitem Cast

Ein Freund von der Universität schickte mir folgenden Schnipsel, der eine überraschende Ausgabe erzeugt.


long g = 287654322;
g += 0f;
System.err.println(g);

Dem Problem kam ich nicht sofort auf die Spur. Aber ein Blick in die Spec verrät es uns:

E1 op= E2 is equivalent to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.(Java Spec)

Also ist unsere Lösung das implizite Casten von float nach long.

final float a = (g + 1f);
g = (long)a; // ((long)2.87654336E8)

Dabei ist es natürlich egal, ob man 0f, 1f oder sonstige kleine Zahl wie 42f verwendet. Das Ergebnis ist dasselbe.

Auf alle Fälle ist mir wie an vielen anderen Stellen klar, dass man „Verkürzungen“ oder andere coole aber zulässige Schreibweisen einfach lassen sollte.
Keep it small and simple heißt hier, dass die „Verkürzung“ eine Verkomplizierung ist, deren Tragweite man manchmal nicht absieht.