Deo zbornika Učimo Javu
Automatsko pretvaranje tipova u Javi
Ako int podijelimo sa int dobijemo int. Ako double podijelimo sa double dobijemo double. Ako int podijelimo sa double ili double sa double, dobijemo double, jer u slučaju nejednakosti tipova Java teži dodjeljivanju što šireg tipa kako se spriječilo gubljenje informacija.
Pravila pretvaranja
-
Ako je bilo koja varijabla u aritmetičkoj binarnoj operaciji (zbrajanje, oduzimanje množenje, dijeljenje, modulo) tipa
double, Java tretira obje vrijednosti kaodouble. -
Ako ni jedna nije
double, ali je jednafloat, Java tretira obje vrijednosti kaofloat. -
Ako ni jedna nije ni
floatnidouble, ali je jednalong, Java tretira obje vrijednosti kaolong. -
Konačno, ako ni jedna nije
double,floatnilong, Java tretira obje vrijednosti kaoint, čak ako u jednadžbi uopće nema cijelih brojeva.
Dakle, rezultat će biti double, float, long ili int, ovisno o tipovima argumenata.
U naredbi pridruživanja, dakle ako postoji znak jednakosti, Java uspoređuje tip na lijevoj strani sa konačnim tipom na desnoj strani. Tip na lijevoj strani neće se promijeniti, ali će se provjeriti da li vrijednost sa desne strane (double, float, int or long) odgovara tipu na lijevoj strani. Sve se može smjestiti u double. Sve osim double može se smjestiti u float. Svaki cjelobrojni tip može se smjestiti u long, ali float i double ne mogu, dok se sve tipa int, short i byte može smjestiti u int. Ako se desna strana može smjestiti u lijevu, pridruživanje se normalno obavlja.
Pridruživanje vrijednosti tipa long varijablama tipa int ili pak vrijednosti tipa double varijablama tipa float može uzrokovati probleme i kompajler vam takva pridruživanja neće dopustiti osim ako eksplicitno navedete da želite pretvaranje (casting). Prisilno pretvaranje tipova označava se navođenjem odgovarajućeg tipa u okruglim zagradama neposredno prije izraza koji treba pretvoriti. Na primjer,
int i = (int) 9.0/4.0;
Kad se vrijednost pretvara u drugi tip prije pridruživanja, niz operacija se poduzima da bi se desna strana “skratila” na pravu veličinu. Za konverziju između realnih (floating point) i cijelih brojeva (npr. int ili long), razlomljeni dio se odbacuje (zaokružuje na nulu). To će proizvesti cijeli broj. Ako je on dovoljno mali da stane u lijevu stranu, pridruživanje je završeno. U suprotnom, ako je prevelik, bit će mu pridružena najveća, a ako je premali, najmanja moguća vrijednost za odgovarajući tip.
Valja voditi računa o tome da prisilno pretvaranje može uzrokovati pogreške kojima će biti vrlo teško ući u trag i zato ovu mogućnost treba koristiti s oprezom.
Izvor: Elliotte Rusty Harold, Java Lecture Notes, preveo Draško Budin, priredio Damjan Pavlica.