Generalizacija Java: opis in metode

Od samega začetka jezika Java je doživelo veliko sprememb, kar je seveda prineslo pozitivne trenutke v njegovi funkcionalnosti. Ena od pomembnih sprememb je uvedba generala ali generalizacije Java. Ta funkcionalnost je omogočila, da je jezik ne le bolj prilagodljiv in bolj vsestranski, temveč tudi veliko varnejši v smislu prinašanja podatkovnih tipov.

Dejstvo je, da je pred uvedbo generikov mogoče generalizirano kodo v Javi ustvariti le z operacijskimi referencami, kot je Object. Takšne reference so lahko dodeljene kateremu koli predmetu. Navsezadnje so vsi razredi v Javi implicitni dediči razreda Object. Vendar pa je ta pristop potencialni vir številnih vrst napak, povezanih z varnostjo, kadar izrecno spreminjamo objekt Object v ciljni tip. Pri uporabi posplošitev se vse prilagoditve izvedejo implicitno in samodejno, kar izključuje celo potencialno možnost napak.


Generalizacija Java: opis in primer

Poglejmo preprost primer uporabe posplošitev na običajni razred na spodnji sliki. In potem bomo nadaljevali s podrobno obravnavo vseh odtenkov in odtenkov Java Generic.
Bodite pozorni na to, kako je napisana deklaracija. Takoj za imenom razreda se prikažejo vogalni oklepaji, v katerih je navedena črka T. To je vrsta ograda, ki bo v procesu ustvarjanja primerka tega razreda zamenjala določena vrsta. Izgleda tako: Pair obj = new Pair (). Opozoriti je treba, da namesto T lahko določite katero koli črko, praviloma pauporabite T, V ali E.


Opomba: začenši z osmo različico Jave, ki določa ciljno vrsto pri razglasitvi povezave, lahko vogalne oklepaje v konstruktorju pustite prazne. Zgornji primer se lahko ponovno napiše na naslednji način: Pair obj = new Pair & lt; & gt; (). Ko je razred deklariran na ta način, lahko to črko uporabite v njenem telesu namesto določenih tipov polj, povezav in metod vračanja objektov. Ker je T, ko je predmet razreda nadomeščen z določenim tipom, bo prvo in drugo polje v tem primeru imelo celo število. Po logiki morajo imeti argumenti firstItem in secondItem, posredovani ustreznemu konstruktorju, tudi vrsto Integer ali njegove podrazrede. Če poskušate poslati podatkovni tip, ki se razlikuje od tistega, ki je bil podan pri ustvarjanju objekta, prevajalnik ne bo zamudil te napake. Torej bo konstruktor z argumenti pri ustvarjanju objekta videti takole: Pair obj = new Pair & lt; & gt; (novo celo število

, novo celo število

). Enako velja za metode setFirst in setSecond. In kot ste verjetno uganili, bo getFirst in getSecond vrnila celo število.

Posplošeni razred z več tipi parametrov

V splošnih razredih je možno tudi razglasiti več parametrov tipa, ki so podani v kotnih oklepajih skozi vejico. V tem primeru je razred Pair prikazan na sliki spodaj.
Kot lahko vidimo, bi morali pri ustvarjanju primerka takšnega razreda v kotnih oklepajih kot parametre navesti število tipov. Če ste seznanjeni s to vrsto podatkovne strukture, kot je Map, potem ste morda tam opaziliuporablja se enako načelo. Prvi argument definira tip ključa, drugi pa tip vrednosti. Treba je opozoriti, da se vrste, ki se prenašajo pri ustvarjanju predmeta argumentov, lahko ujemajo. Da, naslednja deklaracija primerka razreda Pair je popolnoma pravilna: Pair obj.

Nekatere značilnosti posplošitev

Pred nadaljevanjem je treba opozoriti, da prevajalnik Java ne ustvarja nobenih različnih različic razreda Pair. Dejansko se v postopku zbiranja vse informacije o posplošeni vrsti izbrišejo. Namesto tega se ustrezne vrste izvedejo z izdelavo posebne različice razreda Pair. Vendar pa v samem programu, kot prej, obstaja samo ena splošna različica tega razreda. Ta proces se imenuje Java Generic Cleanup type. Opomnimo pomembno točko. Povezave na različne različice istega generičnega razreda java ne morejo kazati na isti predmet. To pomeni, recimo, da imamo dve sklici: Pair obj1 in Pair obj2. Tako se bo pojavila napaka obj1 = obj2. Čeprav sta obe spremenljivki pripadali vrsti Pair, so objekti, na katere se nanašajo, različni. To je živ primer primera generične varnosti Java.

Omejitve za splošne razrede

Pomembno je vedeti, da lahko posplošitve veljajo le za referenčne tipe, to pomeni, da se posredujejo generičnemu argumentu java razreda, argument mora biti nujno tipa razreda. Takšnih enostavnih tipov, kot so npr. Z drugimi besedami, naslednja vrstica za deklaracijo razreda Pare je neveljavna: Pair obj. Vendar pa ta omejitev ne predstavlja resnega problema, kot v Javi za vsePrimitivni tip je ustrezna lupina razreda. Strogo gledano, če želite zapisati celotno in logično vrednost v razredu Pair, bo samodejno pakiranje naredilo vse za vas: Pair obj = new Pair & lt; & gt; (25 true).
Še ena resna omejitev je nezmožnost ustvarjanja primerka tipa parametra. Torej bo naslednja vrstica povzročila napako kompilacije: T prva = nova T (). To je očitno, ker ne veste vnaprej, ali je argument posredovan polnopravnemu razredu ali abstraktni ali v celoti vmesnik. Enako velja za ustvarjanje nizov.

Omejene vrste

Pogosto obstajajo situacije, ko morate omejiti seznam vrst, ki jih lahko posredujete kot generični argument java. Predpostavimo, da želimo v našem razredu Pair zaokrožiti le številčne vrednosti za nadaljnje matematične operacije nad njimi. Da bi to naredili, moramo določiti zgornjo mejo parametra tipa. To se uresniči s pomočjo napovedi nadrazreda, ki ga podedujejo vsi argumenti, ki se prenašajo v kotnih oklepajih. To bo izgledalo takole: razred Pair. Na ta način prevajalnik izve, da namesto parametra T lahko nadomestimo bodisi razred števila bodisi enega od njegovih podrazredov. To je skupni sprejem. Te omejitve se pogosto uporabljajo za zagotavljanje združljivosti parametrov tipa v istem razredu. Razmislite o primeru v našem paru razredov par: razred para. Tukaj povemo prevajalniku, da je tip T lahko poljuben, tip V pa mora nujno biti tipa T ali enega od njegovih podrazredov. "Spodnja" omejitev je popolnoma enaka, toda namesto besednih končnic je beseda napisanasuper To pomeni, da deklaracija razreda Pair pravi, da je namesto T mogoče nadomestiti ArrayList ali kateri koli razred ali uporabnik, ki ga uporablja.

Generične Java metode in konstruktorji

V Javi se lahko posplošitve uporabljajo ne samo za razrede, ampak tudi za metode. Tako lahko generalizirano metodo deklariramo v običajnem razredu.
Kot je razvidno iz zgornje slike, v napovedi posplošene metode ni nič zapletenega. Zadostuje, da pred izračunano metodo vnesete kotne oklepaje in v njih navedete parametre tipov. V primeru konstruktorja se vse opravi na enak način:
Kotni oklepaji v tem primeru se nanašajo na ime konstruktorja, ker ne vrne nobenega pomena. Rezultat obeh programov bo: Integer String

Sorodne publikacije