Generalizacija Java: opis i metode

Od samog početka Java jezika prošlo je mnogo promjena, što je, naravno, donijelo pozitivne trenutke u njegovoj funkcionalnosti. Jedna takva važna promjena je uvođenje Java Generic ili generalizacije. Ta je funkcionalnost učinila jezik ne samo fleksibilnijim i svestranijim, nego i mnogo sigurnijim u smislu davanja tipova podataka.

Činjenica je da prije uvođenja generičkih, generalizirani kod u Javi može biti stvoren samo operativnim referencama kao što je Object. Takve se reference mogu dodijeliti bilo kojem objektu. Uostalom, sve klase u Javi su implicitni nasljednici klase Object. Međutim, ovaj pristup je potencijalni izvor mnogih vrsta sigurnosnih grešaka pri eksplicitnom pretvaranju objekta objekta u ciljni tip. Kada se koriste generalizacije, sva podešavanja se izvršavaju implicitno i automatski, što isključuje čak i potencijalnu mogućnost pogrešaka.


Generalizacija Jave: opis i primjer

Pogledajmo jednostavan primjer primjene generalizacija na uobičajenu klasu na slici ispod. A onda ćemo nastaviti s detaljnim razmatranjem svih nijansi i nijansi Java Generic.
Obratite pozornost na način izrade deklaracije. Odmah nakon naziva klase prikazuju se kutne zagrade u kojima je naznačeno slovo T. To je vrsta rezerviranog mjesta, koje će u procesu kreiranja instance ove klase biti zamijenjeno određenim tipom. Izgleda ovako: Pair obj = new Pair (). Treba napomenuti da umjesto T možete navesti bilo koje slovo, ali, u pravilu,upotrijebite T, V ili E.


Napomena: počevši od osme verzije Jave, navodeći ciljni tip pri deklariranju veze, uglate zagrade u konstruktoru mogu ostati prazne. Gore navedeni primjer može se ponovno napisati na sljedeći način: Pair obj = new Pair & lt; & gt; (). Kada je klasa deklarirana na ovaj način, možete koristiti ovo slovo u svom tijelu umjesto specifičnih tipova polja, veza i metoda vraćanja objekata. Budući da T kada je objekt klase zamijenjen određenim tipom, prvo i drugo polje u ovom slučaju imat će cijeli broj. Slijedeći logiku, argumenti firstItem i secondItem, proslijeđeni odgovarajućem konstruktoru, također bi trebali imati tip Integer ili njegove podrazrede. Ako pokušate poslati vrstu podataka koja se razlikuje od onoga što je specificirano prilikom stvaranja objekta, prevodilac neće propustiti ovu pogrešku. Dakle, konstruktor s argumentima pri stvaranju objekta će izgledati ovako: Pair obj = new Pair & lt; & gt; (novi cijeli broj

, novi cijeli broj

). Isto vrijedi i za metode setFirst i setSecond. I kao što ste vjerojatno pogodili, getFirst i getSecond će vratiti vrijednosti cijelog broja.

Generalizirana klasa s nekoliko tipova parametara

U generaliziranim klasama, moguće je također deklarirati nekoliko parametara tipa koji su dani u uglastim zagradama kroz zarez. U ovom slučaju, Pair klasa je prikazana na slici ispod.
Kao što možemo vidjeti, prilikom kreiranja instance takve klase u uglatim zagradama treba navesti broj tipova, kao parametre. Ako ste upoznati s takvom strukturom podataka kao što je karta, možda ste to i primijetilikoristi se isti princip. Tamo prvi argument definira tip ključa, a drugi je tip vrijednosti. Treba napomenuti da se vrste koje se prenose prilikom stvaranja objekta argumenata mogu podudarati. Da, sljedeća izjava instance Pair klase je apsolutno točna: Pair obj.

Neke značajke generalizacije

Prije odlaska dalje, treba napomenuti da je Java prevodilac ne stvara nikakve različite verzije klase paru. Zapravo, u procesu kompilacije brišu se sve informacije o generaliziranom tipu. Umjesto toga, odgovarajući tipovi izvršavaju se stvaranjem posebne verzije klase Pair. Međutim, u samom programu, kao i prije, postoji jedna generalizirana verzija ove klase. Taj se proces naziva Java Generic Cleanup type. Napominjemo važnu točku. Linkovi na različite verzije iste generičke klase jave ne mogu ukazati na isti objekt. To jest, pretpostavimo da imamo dvije reference: Pair obj1 i Pair obj2. Dakle, pojavit će se pogreška obj1 = obj2. Iako obje varijable pripadaju Pair tipu, objekti na koje se odnose su različiti. Ovo je živopisan primjer Java generičke sigurnosti.

Ograničenja nametnuta općim klasa

Važno je znati da generalizacije mogu se prijaviti samo na tipove upućivanje koji su prošli parametar generičke klase java argument mora biti tipa klase. Takvi jednostavni tipovi, kao što su, primjerice, ili dugački dvostruki, ne mogu se prenijeti. Drugim riječima, sljedeća linija deklaracije klase Pare je nevažeća: Pair obj. Međutim, ovo ograničenje ne predstavlja ozbiljan problem, kao u Javi za svePrimitivni tip je odgovarajuća ljuska klase. Strogo govoreći, ako želite obuhvatiti cjelokupnu i logičku vrijednost u klasi Pair, automatsko pakiranje će učiniti sve za vas: Pair obj = new Pair & lt; & gt; (25 true).
Još je ozbiljnije ograničenje nemogućnost stvaranja instance parametra tipa. Dakle, sljedeći redak će uzrokovati pogrešku kompilacije: T first = new T (). To je očito jer ne znate unaprijed je li argument proslijeđen u punokrvnu klasu ili apstraktnu, ili u potpunosti sučelje. Isto vrijedi i za stvaranje nizova.

Ograničeni tipovi

Često postoje situacije u kojima morate ograničiti popis tipova koji se mogu prenijeti kao generički argument java. Pretpostavimo da u našoj klasi Pair želimo ugraditi samo numeričke vrijednosti za daljnje matematičke operacije nad njima. Da bismo to učinili, moramo odrediti gornju granicu parametra tipa. To se ostvaruje uz pomoć najava superklase, koju nasljeđuju svi argumenti preneseni u kutnim zagradama. Ovo će izgledati ovako: klasa Pair. Na taj način kompajler saznaje da umjesto T-parametra može se zamijeniti ili brojčana klasa ili jedan od njezinih podklasa. Ovo je zajednički prijem. Ta se ograničenja često koriste kako bi se osigurala kompatibilnost parametara tipa u istom razredu. Razmotrite primjer u našem paru klasa para: par klasa. Ovdje govorimo kompajleru da tip T može biti proizvoljan, a tip V nužno mora biti tipa T ili jednog od njegovih podrazreda. "Dno" ograničenje je točno isto, ali umjesto riječi proširenja, riječ je napisanasuper. To jest, deklaracija klase Pair kaže da umjesto T može biti zamijenjen ArrayList, ili bilo koja klasa ili korisnik koji on koristi.

Generičke Java metode i konstruktori

U Javi se generalizacije mogu primijeniti ne samo na klase nego i na metode. Dakle, generalizirana metoda može biti deklarirana u regularnoj klasi.
Kao što se može vidjeti iz gornje slike, u najavi generalizirane metode nema ništa komplicirano. Dovoljno je da prije izračunatog tipa stavite uglate zagrade i u njima navedete parametre tipova. U slučaju konstruktora, sve se radi na isti način:
U tom se slučaju kutne zagrade odnose na ime konstruktora, jer ne vraća nikakvo značenje. Rezultat oba programa bit će: Integer String

Povezane publikacije