Tā kā ir notikusi pati Java valodas izskatsdaudz izmaiņu, kas, bez šaubām, radīja pozitīvus momentus tās funkcionalitātei. Viena no šādām nozīmīgām izmaiņām ir Java Generic ieviešana vai vispārināšana. Šī funkcionalitāte ir padarījusi valodu ne tikai elastīgāku un daudzpusīgāku, bet arī daudz drošāku datu veidu samazināšanas ziņā.

java generics apraksts

Fakts ir tāds, ka pirms ģenērisko zāļu ieviešanaskodu Java var izveidot tikai ar atsauci uz Objekta tipu. Šādas saites var piesaistīt jebkuram objektam. Galu galā, visas Java klases ir netieši pēcnācēji no Objektu klases. Tomēr šī pieeja ir potenciāls avots daudzu veidu drošības kļūdām, ja jūs skaidri no objekta pārvērst objektu mērķa tipam. Ja tiek izmantoti vispārinājumi, visas veidnes tiek veiktas netieši un automātiski, tādējādi izslēdzot pat iespējamo kļūdu rašanos.

Java Generics: apraksts un piemērs

Apskatīsim vienkāršu piemēru, kā piemērot vispārinājumu parastajai klasei attēlā zemāk. Un tikai tad mēs turpināsim sīki pārbaudīt visas Java Generic smalkumus un nianses.

vispārīgs klases java

Piezīme kāPāri klases sludinājums. Tūlīt pēc klases nosaukuma tiek atvērtas leņķa kronšteini, kuros ir norādīta burts T. Tas ir sava veida vietturis, kurš tiek aizvietots ar konkrētu veidu, veidojot šīs klases gadījumu. Tas izskatās šādi: pāros <Integer> obj = jauns pāra <Integer> (). Jāatzīmē, ka T vietā jūs varat norādīt jebkuru burtu, bet, parasti, lieto T, V vai E.

Piezīme: sākot ar astotās versijas Java, norādot mērķa veidu, kad saite tiek deklarēta, jūs varat atstāt konstruktora leņķa kronšteinus tukšā vietā. Tādējādi iepriekšminēto piemēru var pārrakstīt šādi: Pāra <Integer> obj = jauns Pair <> ().

Kad klase ir deklarēta šādā veidā, tad tāJūs varat izmantot šo burtu, nevis konkrētus lauku veidus, atsauces un metodes, ko atgriež ar metodēm. Tā kā T tiek aizstāts ar īpašu veidu, veidojot klases objektu, šajā gadījumā pirmajam un otrajam laukam būs vesels skaitlis.

Pēc loģikas, argumenti firstItem un secondItem,jāpārvieto uz atbilstošo konstruktoru, tam jābūt arī skaitļa skaitlim vai tā apakšklasē. Ja mēģināt izlaist datu tipu, kas atšķiras no tā, kas tika norādīts, veidojot objektu, kompilators neizlaida šo kļūdu. Tātad konstruktors ar argumentiem, veidojot objektu, būs šāds: Pair <Integer> obj = new Pair <> (jauns veselais skaitlis (1), jaunais vesels skaitlis (2)). Tas pats attiecas uz argumentiem setFirst un setSecond metodēm. Un, kā jūs droši vien jau uzminējāt, getFirst un getSecond metodes atgriež vērtību Integer.

Ģenerālas klases ar vairākiem tipa parametriem

Vispārīgās klasēs jūs varat arī deklarēt vairākus raksturlielumus, kas ir norādīti leņķa iekavās, atdalot ar komatu. Šajā klasē Pair klase ir parādīta attēlā.

java generic

Kā redzat, izveidojot šādas klases piemēruLeņķu kvadrātiekos kā parametrus jums ir jānorāda vienāds veidu skaits. Ja jūs esat iepazinušies ar šāda veida datu struktūru kā Karte, tad jūs, iespējams, pamanīsit to pašu principu. Tur pirmais arguments nosaka atslēgas tipu, bet otrais - vērtības veids. Jāatzīmē, ka objektu radīšanai nodoto argumentu veidi var būt vienādi. Tātad, tālāk norādītais Parejas klases instances paziņojums ir pilnīgi pareizs: Pair <String, String> obj.

Dažas vispārināšanas priekšrocības

Pirms turpināt darbu, jāatzīmē, kaJava kompilators neizveido nevienu citu Pare klase versiju. Patiesībā, kompilēšanas procesa laikā tiek dzēsta visa informācija par vispārīgo tipu. Tā vietā tiek atiestatīti atbilstošie tipi, izveidojot īpašu Pāri klases versiju. Tomēr pašai programmai joprojām ir viena vispārīga šīs klases versija. Šis process tiek saukts Java Generic tipa tīrīšanai.

Atzīmēsim svarīgu jautājumu. Atsauces uz vienas un tās pašas java vispārējās klases dažādām versijām nevar norādīt uz to pašu objektu. Tas ir, teiksim, mums ir divas saites: Pair <Integer> obj1 un Pair <Double> obj2. Tāpēc rindiņā obj1 = obj2 rodas kļūda. Lai gan abi mainīgie ir Pair tipa <T>, objekti, uz kuriem tie attiecas, ir atšķirīgi. Tas ir spilgts Java Generic tipu drošības piemērs.

Ierobežojumi, kas noteikti vispārīgajām nodarbībām

Ir svarīgi zināt, ka var tikt izmantoti vispārinājumitikai atsauces veidu, tas ir, nodot parametrus vispārīgu klases java arguments jābūt klases tipa. Šīs vienkāršās veidi, piemēram,, piemēram, dubultā vai garš, nevar tikt nodota. Citiem vārdiem sakot, šādu rindu pārī klases deklarācija nav atļauts: pāris <int> obj. Tomēr šis ierobežojums nav nopietna problēma, jo ir atbilstoša Java iesaiņojums klases katrai primitīvo tipu. Stingri runājot, ja klasē pāris vēlaties iekapsulēt vesels un Būla vērtība avtoupakovka dara visu, lai jums: pāris <Integer, Boolean> obj = jauns pāris <> (25, true).

Cits nopietns ierobežojums irnav iespējams izveidot tipa parametra gadījumu. Tātad, nākamajā rindiņā radīsies kompilācijas kļūda: T pirmais = jauns T (). Tas ir acīmredzami, jo jūs iepriekš nezināt, vai pilnā klasē vai abstraktā saskarne tiks nodota kā arguments. Tas pats attiecas arī uz masīvu izveidi.

Ierobežoti veidi

Diezgan bieži ir situācijas, kadIr nepieciešams ierobežot to veidu sarakstu, kurus java ģenerālajā klasē var nodot par argumentu. Pieņemsim, ka mūsu Pair klasē mēs vēlamies iekļaut tikai skaitliskās vērtības tālākām matemātiskām operācijām uz tiem. Lai to paveiktu, mums jānosaka tipa parametra augšējā robeža. Tas tiek īstenots, izmantojot superclass deklarāciju, kas ir mantota ar visiem leņķa iekavās ietvertajiem argumentiem. Tas izskatās šādi: klases Pair <T paplašina Number>. Šādā veidā kompilators uzzina, ka T parametra vietā jūs varat aizvietot vai nu skaitļu klasi, vai vienu no tās apakšklasēm.

Šī ir izplatīta metode. Šādi ierobežojumi bieži tiek izmantoti, lai nodrošinātu vienas klases tipa parametru savietojamību. Apsveriet piemēru mūsu Pair klasē: Pair klase <T, V paplašina T>. Šeit mēs pasakām kompilatoram, ka T tips var būt patvaļīgs, un V tipam jābūt vai nu T tipa vai kādai no tā apakšklasēm.

Ierobežojums "no apakšas" notiek tieši tāpatattēls, bet vārda paplašināšanas vietā vārds super ir rakstīts. Tas nozīmē, ka klases Pair <T super ArrayList> deklarācija norāda, ka tā vietā T var aizstāt vai nu ArrayList, vai jebkuru citu mantoto klasi vai saskarni.

Vispārīgas Java metodes un konstruktori

Java vispārinājumus var piemērot ne tikai attiecībā uz klasēm, bet arī metodēm. Tātad vispārināto metodi var deklarēt parastajā klasē.

vispārīgas java metodes

Kā redzat attēlā iepriekš, vispārējās metodes deklarācijā nav nekas sarežģīts. Pirms atgriešanās tipa metodes ir pietiekami novietot leņķa kronšteinus un norādīt tiem tipa parametrus.

Konstruktora gadījumā viss tiek darīts tādā pašā veidā:

java vispārējā tipa tīrīšana

Šādā gadījumā leņķa kronšteini tiek ievietoti pirms konstruktora nosaukuma, jo tas neatgriež vērtību. Abu programmu darba rezultāts būs:

Vesels skaitlis

Virkne