/ / Java Generics: apraksts un metodes

Java Generics: apraksts un metodes

Tā kā ir notikusi pati Java valodas izskatsdaudz pārmaiņ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

Ģenerālas klasēs jūs varat arī deklarēt vairākus tipa parametrus, 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 esat iepazinies ar tā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 uz atsauču tipiem, tas ir, par argumentu, kas nodots parametram, vispārējam klases javas argumentam jābūt klases tipam. Šādus vienkāršus veidus, piemēram, dubults vai garš, nevar pārsūtīt. Citiem vārdiem sakot, šāda Pare klases deklarācijas rindiņa nav derīga: Pair <int> obj. Tomēr šis ierobežojums nav nopietna problēma, jo Java katram primitīvam tipam ir atbilstoša iesaiņojuma klase. Stingri sakot, ja jūs vēlaties iekļaut veselu skaitli un loģisku vērtību Pāri klasē, automātiskais pakotne darīs visu, lai jūs: Pair <Integer, Boolean> obj = new Pair <> (25, true).

Vēl viens 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 klases Pair vēlamies ielenkt tikai skaitliskās vērtības turpmākām matemātiskas darbības 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 konstatē, ka tā vietā, lai parametrs T var būt aizvietotas vai Number klase vai viens no tā apakšklases.

Šī 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ādam 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

Leņķiekavas šajā gadījumā likt pirms nosaukuma dizainers, jo viņš nav atgriešanās vērtību. Abu programmu darba rezultāts būs:

Vesels skaitlis

Virkne

Lasīt vairāk: