Iki šiol maniau, kad, pvz:
i += j;
buvo tik trumpinys:
i = i + j;
Bet jei pabandysime tai:
int i = 5;
long j = 8;
Tuomet i = i + j;
nebus kompiliuojamas, bet i += j;
bus kompiliuojamas gerai.
Ar tai reiškia, kad iš tikrųjų i += j;
yra trumpinys, reiškiantis kažką panašaus į šį
i = (i tipas) (i + j)
?
Kaip visada, į šiuos klausimus atsakymą pateikia JLS. Šiuo atveju §15.26.2 Sudėtiniai priskyrimo operatoriai. Ištrauka:
Sudėtinė priskyrimo išraiška, kurios forma yra E1 op= E2
, yra lygiavertė E1 = (T)((E1) op (E2)), kur
T
yra E1
tipas, išskyrus tai, kad E1
įvertinamas tik vieną kartą.
Pavyzdys iš §15.26.2
[...] toliau pateiktas kodas yra teisingas:
short x = 3; x += 4.6;
ir jo rezultatas yra x reikšmė 7, nes jis yra lygiavertis:
short x = 3; x = (short)(x + 4,6);
Kitaip tariant, jūsų prielaida yra teisinga.
Labai geras klausimas. Java kalbos specifikacija patvirtina jūsų pasiūlymą.
Pavyzdžiui, toliau pateiktas kodas yra teisingas:
short x = 3; x += 4,6;
ir gaunama x reikšmė 7, nes ji yra lygiavertė:
trumpas x = 3; x = (short)(x + 4,6);
jums reikia iš long
į int
tiesiogiai išversti i = i + l
, tada jis bus sukompiliuotas ir duos teisingą išvestį.
i = i + (int)l;
arba
i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.
tačiau +=
atveju tai veikia gerai, nes operatorius netiesiogiai atlieka tipo atrinkimą iš dešiniojo kintamojo tipo į kairiojo kintamojo tipą, todėl nereikia atlikti aiškaus atrinkimo.