Kaj je generika v Javi?

Generic v Javi je bil predstavljen leta 2004 kot novost programskega jezika Java in je bil del izdaje JDK 5. Najpogosteje se uporablja skupaj z okvirom zbirk Java. Od danes je ena najpomembnejših in najbolj iskanih lastnosti programskega jezika Java.

Generic Java so našli leta 1998 štirje posamezniki, in sicer Gilad Bracha, Martin Odersky, David Stoutamire in Philip Wadler. Širitev jezika Java je podpirala generične vrste. Bil je namenjen doseganju dveh glavnih ciljev, ki sta:

  1. Varnost tipa
  2. Ponovna uporaba kode

Definicija generike v Javi

Generike je mogoče opredeliti kot način za dosego ponovne uporabe kode z določitvijo generičnih razredov, vmesnikov, konstruktorjev in metod, ki jih je mogoče uporabiti z različnimi tipi podatkov, prav tako pa lahko dosežemo varnost tipa tako, da predhodno izjavite, kakšen tip podatkov se uporablja pri izvajanju, s čimer se odpravi možnosti napake med izvajanjem.

Kako se generične aplikacije izvajajo v Javi?

Generična oprema se izvaja z uporabo kotnih oklepajev "". V oklepaju je priložen parameter tipa „T“. Primer, . Parameter tipa „T“ je nosilec mesta, kar pomeni, da mu bo med izvajanjem dodeljena vrsta podatkov. Na primer, generični razred bo opredeljen kot:

public class MyGenericClass (…)

Spodaj so standardni parametri tipa:

  • T: Vtipkajte
  • E: Element
  • N: Številka
  • K: Ključ
  • V: Vrednost

S, U, V in tako naprej se uporabljajo za definiranje drugega, tretjega in četrtega parametra v primeru, da se uporabljajo večparametri.

Razumevanje generike v Javi

Zdaj se morda sprašujete, kaj je varnost tipa in kako deluje? Ali pa se generični razredi, vmesniki, konstruktorji in metode razlikujejo od naših rednih razredov in metod, zaradi katerih so ponovno uporabni? Pa ugotovimo.

Java, ki je statično vtipkan jezik, zahteva, da pred njegovo uporabo izjavite "tip", ki je podatkovni tip vrednosti, ki ga ima spremenljivka.

Primer: String myString =”eduCBA”;

Tu je "String" vrsta podatkov, "myString" je spremenljivka, ki bo vsebovala vrednost, katere tip je String.

Če poskusite namesto niza poskusiti prenesti Boolovo vrednost:

String myBooleanStr = true;

Takoj boste dobili napako v času prevajanja z napisom »Vtipkajte neusklajenost: ni mogoče pretvoriti iz logičnega v String«.

Kako dosežemo ponovno uporabo kode z generiko?

Zdaj pa določimo navadno metodo:

public static void welcome(String name)(
System.out.println("welcome to " + name);
)

Ta metoda se lahko prikliče samo s posredovanjem parametra niza. Na primer:

welcome(“eduCBA”);

Njeni rezultati bodo "dobrodošli v izobraževanju educa".

Vendar pa te metode ne morete sklicati tako, da zaobidete druge vrste podatkov, na primer celo število ali logično. Če poskusite to storiti, boste pozvani z napako v času prevajanja, v kateri je navedeno, da metoda dobrodošlice (String) v vrsti Runner ni primerna za argumente (logična). Pomeni, da nobene druge vrste podatkov ne morete posredovati metodi, ki kot parameter sprejema samo niz.

To pomeni tudi, če želite poklicati podobno metodo za drugo vrsto podatkov, potem boste morali napisati novo metodo, ki sprejema zahtevani tip podatkov kot parameter. Ta značilnost metod ponovnega pisanja s parametri različnih tipov podatkov je znana tudi kot preobremenitev metode. Glavna pomanjkljivost tega je povečanje velikosti vaše kode.

Vendar pa bi lahko uporabili tudi Generics za ponovno pisanje zgoraj omenjene metode in jo uporabili za katero koli vrsto podatkov, ki jo potrebujemo.

Opredelitev splošne metode:

public static void welcome(T t)(
System.out.println("it is " + t);
)

Opomba : Tu je "t" predmet tipa T. T bo dodeljen tip podatkov, ki se uporablja za priklic metode.

Zdaj lahko to metodo ponovno uporabite tako, da jo po potrebi prikličete za niz ali logično številko ali celo število ali katero koli drugo vrsto podatkov.

welcome("educate");
Integer Myint = 1;
welcome(Myint)
welcome(true);

Zgornje izjave bodo dale spodnji izid:

To je Educa
To je 1
To je res

Zato lahko z uporabo generike tukaj ponovno uporabimo svojo metodo za različne vrste podatkov.

Kako dosežemo varnost tipa z uporabo generike?

Ena večjih razlik med Arrays in Collection je, da Arrays lahko shranjujejo samo homogene podatke, medtem ko zbirke lahko shranjujejo heterogene podatke. To je zbirka lahko shrani poljubno uporabniško določeno vrsto podatkov / objekte.

OPOMBA: V zbirkah so lahko samo predmeti (uporabniško določen tip podatkov) in ne primitivni tip podatkov. Če želite delati s primitivnimi podatki, zbirke vrst uporabljajo razrede zavijanja.

Zdaj pa razmislimo o ArrayListu.

ArrayList myList = new ArrayList();

V objekt ArrayList dodajmo podatke vrste String, Integer in Double.

myList.add("eduCBA");
myList.add(1);
myList.add(5.2);

Pri tiskanju predmeta ArrayList lahko vidimo, da ima naslednje vrednosti: (eduCBA, 1, 5.2).

Zdaj, če želite te vrednosti nato pridobiti v spremenljivke, jih boste morali vnesti.

String someStr = (String)myList.get(0);
Integer someInt = (Integer)myList.get(1);
Double someFlt = (Double)myList.get(2);

V primeru, da ne vtipkate tipkovnice, boste pozvani z napako v prevajalnem času, v kateri je pisalo "Neujemanje vrste: ni mogoče pretvoriti iz objekta v niz".

Iz tega lahko sklepate, da morate med nalaganjem predmetov iz svojega ArrayList-a vtipkati ustrezne vrste. Vprašanje, ki se postavlja tukaj, je, kako boste vedeli, v katero vrsto podatkov jo vtipkati? V realnem času bo vaš ArrayList vseboval na tisoče posnetkov in njihovo vnašanje v različne vrste podatkov za vsak posamezen predmet ne bo mogoče. Morda boste na koncu vnesli napačen tip podatkov. Kaj se zgodi potem?

Tokrat ne boste dobili napake v času prevajanja, ampak boste vrgli napako med izvajanjem in navedli "Izjema v niti" glavni "java.lang.ClassCastException: java.lang.Integer ni mogoče dati na java.lang.String na com.serviceClasess.Runner .main (Runner.java:43) ”.

Ker ne moremo zagotoviti vrste podatkov, ki so prisotni v zbirki (v tem primeru ArrayList), se štejejo, da niso varni za uporabo glede na vrsto. Tu se začnejo uporabljati generiki za zagotavljanje varnosti tipa.

Uporaba ArrayList z generiko:

ArrayList myList = new ArrayList();

Upoštevajte, da je v kotnih oklepajih "" določena vrsta strune, kar pomeni, da lahko ta posebna implementacija ArrayList vsebuje samo podatke vrste String. Če mu poskušate dodati katero koli drugo vrsto podatkov, bo preprosto vrgel napako pri prevajanju. Tu ste naredili svoj varni tip ArrayList tako, da ste odpravili možnost, da dodate drug tip podatkov, ki ni "String".

Zdaj, ko ste določili vrsto podatkov, ki jo je dovoljeno dodajati v vašo zbirko s pomočjo generike, vam ni treba več vnašati podatkov med nalaganjem podatkov. To pomeni, da lahko preprosto pridobite svoje podatke tako, da napišete:

String someStr = myList.get(0);

Kako generiki na Javi olajšajo delo?

Pomaga, da so vaše zbirke varne za tip in s tem zagotovite, da se koda ne bo pozneje odpovedala zaradi izjeme iz časa izvajanja. Prav tako prihrani koder pred tem, da mora vtipkati vsak predmet v zbirki, s čimer bo razvoj kode hitrejši in enostavnejši. Z uporabo generičnih razredov in metod lahko med uporabo tudi ponovno uporabite kodo po zahtevanih vrstah podatkov.

Kaj še lahko naredite z Generiki na Javi?

Do zdaj smo videli, kako lahko z generiko dosežemo varnost tipa in ponovno uporabo kode. Zdaj pa si oglejmo še druge funkcije, ki jih generiki ponujajo. To so:

  1. Omejene in več omejene vrste
  2. Vnesite znakovne znake

Vrsta omejenega : V primeru omejenega tipa je podatkovni tip parametra omejen na določen obseg. To dosežemo s pomočjo ključne besede "podaljša".

Na primer, razmislimo o splošnem razredu z omejenim parametrom tipa, ki razširja vmesnik Runnable:

class myGenericClass()

Zdaj, medtem ko ustvarja svoj predmet v drugem razredu:

myGenericClass myGen = new myGenericClass();

Zgornja izjava se bo brez napake izvedla brezhibno. To pomeni, da lahko v primeru omejenega tipa prenesete isti tip razreda ali njegov nadrejeni razred. Prav tako lahko vrsto parametra privežete na vmesnik in prenesete njegove izvedbe, ko ga prikličete, kot je primer v zgornjem primeru.

Kaj se zgodi, če poskusite uporabiti katero koli drugo vrsto parametra?

myGenericClass myGen = new myGenericClass();

V zgornjem primeru se prikaže napaka v času sestavljanja z napisom »Nepovezana meja: Tip Integer ni veljaven nadomestek za typecast tipa myGenericClass«.

Več omejenih vrst: V primeru več vrst omejenih vrst lahko podatke podatkov parametra vežemo na več vrst. Na primer

Class myGeneric()

V tem primeru lahko prenesete katero koli vrsto, ki širi Številčni razred in uporablja vmesnik Runnable. Pri uporabi več omejenih vrst je treba upoštevati nekaj stvari:

  1. Naenkrat ne moremo razširiti več kot enega razreda.
  2. Hkrati lahko razširimo poljubno število vmesnikov, če za vmesnike ni omejitev.
  3. Ime razreda bi moralo biti vedno prvo, nato pa ime vmesnika, če ne, bo prišlo do napake pri prevajanju.

Vrsta Wildcards: Predstavljajo jih "?" - znak vprašanja. Uporablja dve glavni ključni besedi:

sega (za določitev zgornje meje) in super (za določitev spodnjih meja).

Na primer

ArrayList al

Ta predmet ArrayList “al” bo vseboval vse podatke tipa T in vse njegove podrazrede.

ArrayList al

Ta predmet ArrayList "al" bo vseboval vse podatke tipa T in vse njegove superklase.

Prednosti generike v Javi

1. Prilagodljivost : Generics nudi naši kodi prilagodljivost za prilagajanje različnih vrst podatkov s pomočjo generičnih razredov in metod.

2. Vzdrževanje in ponovna uporaba kode: Zaradi generičnih razredov in metod ni treba ponovno pisati kode, če se pozneje spremenijo zahteve, kar olajša vzdrževanje in ponovno uporabo kode.

3. Varnost tipa: zagotavlja varnost tipa v okviru zbiranja z definiranjem podatkovnih vrst, ki jih lahko shranjuje vnaprej in odpravlja vse možnosti za neuspeh med izvajanjem zaradi ClassCastException.

4. Odprava potrebe po vnosu besedila: Ker so tipi podatkov, ki jih hranijo zbirke, že določeni, jih ni treba vnašati v času iskanja. To zmanjša dolžino kode in zmanjša tudi napor koderja.

Generiki v znanju Java

Če želite sodelovati z Genericom, morate dobro poznati osnove Jave. Razumeti morate, kako deluje preverjanje tipa in vlivanje tipov. Potrebno je temeljito poznavanje drugih konceptov, kot so preobremenitev metod, razmerje med razredi staršev in otrok, vmesniki in njihova izvedba. Razumevanje razlike med primitivnimi vrstami podatkov (sistemsko določen tip podatkov) in objekti (uporabniško določen tip podatkov) je ključnega pomena pri delu z okvirom zbiranja.

Zakaj bi na Javi uporabljali Generike?

Z uporabo generike je naša koda bolj vzdržna, saj zmanjšuje potrebo po ponovnem pisanju kode, ki je značilna za tip podatkov, vsakič, ko se zahteva spremeni. Z uporabo generično omejene vrste lahko omejite vrsto podatkov in hkrati zagotovite prilagodljivost kodi z definiranjem njenega obsega. Koda je verjetno, da pozneje ne bo uspela, saj zagotavlja varnost tipa, zaradi česar je vaša koda manj nagnjena k napakam.

Področje uporabe generike na Javi

Obseg generike je omejen na čas priprave. To pomeni, da je generični koncept uporaben samo v času prevajanja, ne pa tudi med izvajanjem. Na primer,

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

Tu so vse zgornje štiri izjave ene in iste. Dovolili bodo dodajanje katere koli vrste podatkov na seznam seznama.

Zaključek

Generics olajša kodiranje koderja. Z zmanjšanjem možnosti preverjanja vrste zmanjšuje možnosti za nalet ClassCastException. Popolnoma odpravlja potrebo po kastingu tipa, kar pomeni, da je treba napisati manj kode. Omogoča nam izvedljivost splošnih algoritmov, ki niso odvisni od vrste podatkov, s katerimi delajo.

Priporočeni članki

To je vodnik za Kaj so generiki na Javi? Tu smo razpravljali o spretnostih, področju uporabe, delu, razumevanju in prednosti generike na Javi. Če želite izvedeti več, lahko preberete tudi druge naše predlagane članke -

  1. Kaj je skupni vmesnik za prehod
  2. Kako namestiti Java 8
  3. kaj je miloUI
  4. Kaj je JavaScript?
  5. Java Booleans