Frem til i dag trodde jeg at f.eks:
i += j;
bare var en snarvei for:
i = i + j;
Men hvis vi prøver dette:
int i = 5;
long j = 8;
Da vil i = i + j;
ikke kompilere, men i += j;
vil kompilere fint.
Betyr det at i += j;
faktisk er en snarvei for noe slikt som dette
i = (type i) (i + j)
?
Som alltid når det gjelder slike spørsmål, er det JLS som har svaret. I dette tilfellet §15.26.2 Sammensatte tilordningsoperatorer. Et utdrag:
Et sammensatt tilordningsuttrykk av formen E1 op= E2
er ekvivalent med E1 = (T)((E1) op (E2))
, der T
er typen til E1
, bortsett fra at E1
bare evalueres én gang.
Et eksempel hentet fra §15.26.2.
[...] følgende kode er korrekt:
short x = 3; x += 4.6;
og resulterer i at x får verdien 7 fordi det tilsvarer:
kort x = 3; x = (kort)(x + 4,6);
Antagelsen din er med andre ord korrekt.
Veldig godt spørsmål. Java-språkspesifikasjonen bekrefter forslaget ditt.
For eksempel er følgende kode korrekt:
short x = 3; x += 4.6;
og resulterer i at x har verdien 7 fordi det tilsvarer:
kort x = 3; x = (kort)(x + 4,6);
du må caste fra long
til int
eksplisitt
i tilfelle i = i + l
, så vil det kompilere og gi riktig utdata. som f.eks.
i = i + (int)l;
eller
i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.
men når det gjelder +=
, fungerer det helt fint fordi operatøren implisitt gjør typekastingen fra typen til høyre variabel til typen til venstre variabel, slik at det ikke er nødvendig å kaste eksplisitt.