java generics tutorial with examples
Java Generics so nabor funkcij, ki omogočajo pisanje kode neodvisno od vrste podatkov. Ta članek podrobno pojasnjuje Java Generics s primeri:
Generiki so ena pomembnih lastnosti Java in so bili predstavljeni od Jave 5 naprej.
Po definiciji so generiki nabor funkcij jezika Java, ki programerju omogočajo uporabo generičnih vrst in funkcij in s tem zagotavljajo varnost tipov.
Kaj se boste naučili:
Kako delujejo generiki v Javi?
Če ste že delali s C ++, potem je Java Generics enako kot predloge v C ++. Java Generics vam omogoča, da v definicijo razreda / metode vključite parameter, ki bo imel vrednost primitivnega podatkovnega tipa.
Na primer, lahko imate generični razred 'Array', kot sledi:
Niz razredov {….}
Kje je parametriziran tip.
nastavitev c ++ v eclipseu
Nato lahko ustvarite predmete za ta razred, kot sledi:
Array int_array = new Array () Array char_array = new Array ();
Glede na generični parametrizirani razred lahko ustvarite predmete istega razreda z različnimi podatkovnimi vrstami kot parametri. To je glavno bistvo uporabe Java Generics.
Podobno lahko napišete generično metodo s parametriziranim tipom za razvrščanje matrike in nato to metodo ustvarite s katerim koli primitivnim tipom.
Java Generics se večinoma uporabljajo z zbirko Java. Različne zbirke, kot so LinkedList, List, Map, HashMap itd., Uporabljajo Generics za izvedbo. Generiki zagotavljajo varnost tipov, saj se preverjanje tipa izvaja v času prevajanja, s čimer postane vaša koda stabilnejša.
Poglejmo zdaj podrobneje splošne razrede in metode ter druge sorodne teme.
Splošni razredi
Splošni razred je enak običajnemu razredu, le da imenu razreda sledi tip v oglatih oklepajih.
Splošna opredelitev generičnega razreda je naslednja:
razred ime_razreda
{
spremenljivke razreda;
… ..
razredne metode;
}
Ko je razred definiran, lahko ustvarite predmete katere koli vrste podatkov, kot želite:
class_name obj = new class_name ();
Na primer, za objekt Integer bo izjava:
class_name obj = new class_name;
Podobno bo za podatkovni tip String objekt:
class_name str_Obj = new class_name;
Primer izvedbe za generični razred je prikazan spodaj.
class MyGenericClass { T obj; void add(T obj) { this.obj=obj; } T get() { return obj; } } class Main { public static void main(String args()) { MyGenericClass m_int=new MyGenericClass(); m_int.add(2); MyGenericClassmstr=new MyGenericClass(); mstr.add('SoftwaretestingHelp'); System.out.println('Member of MyGenericClass:' + m_int.get()); System.out.println('Member of MyGenericClass:' + mstr.get()); } }
Izhod:
V zgornjem programu je razred MyGenericClass generični razred. Ima dve metodi, to je add and get. Metoda add inicializira generični objekt, medtem ko metode get vrnejo objekt.
V glavni funkciji prijavimo dva predmeta vrste Integer in String. Oba predmeta inicializiramo z ustreznimi začetnimi vrednostmi z uporabo metode add in nato z metodo get dobimo vsebino teh predmetov.
Zgoraj smo predstavili primer generičnega razreda z enim parametrom tipa. Toda v resnici ima lahko razred tudi več parametrov tipa. V tem primeru so parametri tipa ločeni z vejico.
Naslednji primer to dokazuje:
classTest_Generics { T1 obj1; // An object of type T1 T2 obj2; // An object of type T2 // constructor to initialise T1 & T2 objects Test_Generics(T1 obj1, T2 obj2) { this.obj1 = obj1; this.obj2 = obj2; } public void print() { System.out.println('T1 Object:' + obj1); System.out.println('T2 Object:' + obj2); } } class Main { public static void main (String() args) { Test_Genericsobj = newTest_Generics('Java Generics', 1); obj.print(); } }
Izhod:
V tem programu imamo dva tipa parametrov, to sta T1 in T2. Imamo funkcije za inicializacijo predmetov članov in tudi za tiskanje vsebine. V glavni funkciji prijavimo objekt z dvema vrstama, to je String in Integer. Rezultat programa prikazuje vsebino ustvarjenega predmeta.
Tako kot razredi lahko imate tudi generične vmesnike. Vse o vmesnikih bomo izvedeli v ločeni temi.
Java generične metode
Tako kot lahko imate generične razrede in vmesnike, lahko imate tudi generične metode, če ne potrebujete celotnega razreda, da bi bili generični.
Naslednji program prikazuje izvajanje generične metode “printGenericArray”. Upoštevajte klic metode v glavni funkciji. Tu opravimo dva klica generične metode, prvič s tipom in nato s tipom.
public class Main{ public static void printGenericArray(T() items) { for ( T item : items){ System.out.print(item + ' '); } System.out.println(); } public static void main( String args() ) { Integer() int_Array = { 1, 3, 5, 7, 9, 11 }; Character() char_Array = { 'J', 'A', 'V', 'A', 'T','U','T','O','R','I','A', 'L','S' }; System.out.println( 'Integer Array contents:' ); printGenericArray(int_Array ); System.out.println( 'Character Array contents:' ); printGenericArray(char_Array ); } }
Izhod:
Omejeni parametri tipa
Parametri omejenega tipa se prikažejo, ko želite omejiti podatkovne tipe v generikih. Na primer, če želite, da določen generični razred ali metoda ali kateri koli vmesnik deluje samo za numerične tipe podatkov, lahko to določite s ključno besedo »extends«.
To je prikazano spodaj:
List myList = new ArrayList(); List list1 = new ArrayList();
Zgoraj navedeni deklaraciji bo prevajalnik sprejel, saj sta Long in Integer podrazreda Number.
Naslednja izjava pa bo problem.
List list = new ArrayList();
To bo povzročilo napako pri času prevajanja, ker niz ni številka. Simbol '?' V zgornjem primeru je znan kot nadomestni znak in o njem bomo razpravljali v nadaljevanju.
Tako se na splošno parametri omejenega tipa večinoma uporabljajo, kadar želite omejiti podatkovne tipe, ki se uporabljajo v vaši generični kodi.
Nadomestni znak Java Generics
V Javi je nadomestni znak označen z vprašajem ‘?’, Ki se uporablja za sklicevanje na neznano vrsto. Nadomestni znaki se večinoma uporabljajo z generičnimi zdravili kot vrsto parametrov.
Pri uporabi generičnih nadomestnih znakov si morate zapomniti eno točko, da čeprav je objekt nadrazred vseh drugih razredov, zbirka predmetov ( Na primer, List) ni superrazred vseh drugih zbirk.
Poleg tega, da ga uporabite kot vrsto parametra, lahko nadomestni znak uporabite tudi kot polje, lokalno spremenljivko in kot tako. Vendar nadomestnega znaka nikoli ne morete uporabiti kot nadtip ali kot argument tipa za priklic generične metode ali v primeru ustvarjanja primerka generičnega razreda.
Obstaja veliko primerov nadomestnih parametriziranih tipov (tukaj je vsaj en argument vrste nadomestni znak), kot je prikazano spodaj, nadomestne znake, uporabljene na različnih mestih, pa bomo razlagali različno:
- Zbirka <: Zbirka označuje vse primerke vmesnika zbirke ne glede na uporabljeni argument tipa.
- Seznam extends Number< : Seznam predstavlja vse vrste seznamov, pri katerih bo vrsta elementa številka.
- Primerjalnik: Vse primerke primerkov vmesnika za argumente tipa, ki so Stringsupertypes.
Upoštevajte, da je parameter z nadomestnimi parametri pravilo, ki je namenjeno prepoznavanju veljavnih vrst. To ni konkreten podatkovni tip. Splošni nadomestni znaki so lahko omejeni ali neomejeni.
# 1) Neomejeni nadomestni znaki
V neomejenih nadomestnih znakih ni omejitev za spremenljivke tipa in je označeno na naslednji način:
ArrayList mylist = new ArrayList(); ArrayList my_strList = new ArrayList();
# 2) Vezani nadomestni znaki
O omejenih vrstah smo že razpravljali. Ti postavljajo omejitve za podatkovni tip, ki se uporablja za primerjanje parametrov tipa z uporabo ključnih besed - extends ali super. Te nadomestne znake lahko nadalje razdelimo na nadomestne znake zgornje meje in spodnje meje spodnje meje.
- Nadomestni zgornji meji
Če želite, da je vaš splošni izraz veljaven za vse podrazrede dane vrste, potem s ključno besedo extends podate nadomestni znak Upper Bounded.
Na primer, predpostavimo, da potrebujete generično metodo, ki podpira seznam, seznam itd., potem lahko podate nadomestni znak zgoraj, kot Seznam . Ker je številka superrazred, bo ta generična metoda delovala za vse njene podrazrede.
Naslednji program to dokazuje.
importjava.util.*; public class Main { private static Number summation (List numbers){ double sum = 0.0; for (Number n : numbers) sum += n.doubleValue(); return sum; } public static void main(String() args) { //Number subtype : Integer Listint_list = Arrays.asList(1,3,5,7,9); System.out.println('Sum of the elements in int_list:' + summation(int_list)); //Number subtype : Double List doubles_list = Arrays.asList(1.0,1.5,2.0,2.5,3.0,3.5); System.out.println('Sum of the elements in doubles_list:' + summation(doubles_list)); } }
Izhod:
najboljša programska oprema za izdelavo diagramov poteka
Tu smo zagotovili nadomestni nadomestni znak List argumentu tipa »seštevanje«. V glavni funkciji določimo dva seznama, to je int_list tipa Integer in dvojni_list tipa Double. Ker sta Integer in Double podrazreda Number, seštevanje funkcij odlično deluje na obeh seznamih.
- Spodnji mejni nadomestni znaki
Če želite, da generični izraz sprejme vse nadrazrede določene vrste, lahko za svoj argument tipa določite spodnji mejni nadomestni znak.
Primer izvedbe tega je spodaj:
importjava.util.*; class Main { public static void main(String() args) { //Integer List ListInt_list= Arrays.asList(1,3,5,7); System.out.print('Integer List:'); printforLowerBoundedWildcards(Int_list); //Number list ListNumber_list= Arrays.asList(2,4,6,8); System.out.print('Number List:'); printforLowerBoundedWildcards(Number_list); } public static void printforLowerBoundedWildcards(List list) { System.out.println(list); } }
Izhod:
V tem programu je določen spodnji mejni nadomestni znak »Seznam«. Nato imamo v glavni funkciji seznam vrst in seznam. Kot smo uporabili spodnji mejni nadomestni znak, je razred Number nadrazred Integer veljaven argument tipa.
Prednosti Java Generics
# 1) Varnost tipa
Generiki zagotavljajo varnost tipa. To pomeni, da se preverjanje tipa izvaja v času prevajanja in ne v času izvajanja. Tako med izvajanjem ni možnosti, da bi dobili ClassCastException, saj bodo uporabljeni pravilni tipi.
importjava.util.*; class Main { public static void main(String() args) { List mylist = new ArrayList(); mylist.add(10); mylist.add('10'); System.out.println(mylist); List list = new ArrayList(); list.add(10); list.add('10');// compile-time error System.out.println(list); } }
V zgornjem programu imamo dva seznama, enega brez generičnih zdravil in drugega z generičnimi zdravili. Na splošnem seznamu ni vrste Varnost tipa. Kot element lahko dodate celo število, niz itd., Ki je sprejeto.
Na splošni seznam lahko dodate samo en tip elementa, ki je podan v generičnem izrazu. Če poskušate dodati element druge vrste, potem pride do napake v času prevajanja.
V zgornjem programu je napaka časa prevajanja utripala v vrstici:
list.add('10');
# 2) Ponovna uporaba kode
razlika med zdravjem in testiranjem dima
Z uporabo Generics vam ni treba pisati ločene kode za vsak podatkovni tip. Lahko napišete en razred ali metodo itd. In ga uporabite za vse vrste podatkov.
# 3) Ni potrebe po tipiziranju
Ko uporabljate Generics, prevajalnik ve za uporabljene vrste, zato ni potrebe po tipiziranju.
Upoštevajte spodnjo kodo:
List mylist = new ArrayList(); mylist.add('Java'); String mystr = (String) list.get(0); //typecasting required
Kot lahko vidite, ko se uporablja običajni seznam, morate element seznama vtipkati v ustrezen tip, kot je to storjeno za zgornji mystr.
Zdaj zapišimo isto kodo z generičnim seznamom.
List list = new ArrayList(); list.add('Java'); String mystr = list.get(0);
Tu smo vrsto niza določili kot splošni izraz za izjavo seznama. Če želite pridobiti posamezne elemente s tega seznama, nam ni treba natipkati.
# 4) Implementirajte generične algoritme
Ko za generiranje kode uporabljate generike, lahko uporabite veliko več generičnih algoritmov.
# 5) Preverjanje v času prevajanja
Kot smo že omenili, ko v svojem programu Java uporabljate generike, prevajalnik preveri vrste v času prevajanja in tako prepreči nenormalno ukinitev programa med izvajanjem.
Pogosto zastavljena vprašanja
V # 1) Zakaj v Java uporabljamo generike?
Odgovor: Generiki zagotavljajo neodvisnost tipa, tj. Lahko določimo parameter tipa, medtem ko definiramo razred / vmesnik / metodo itd., Tako da lahko med dejanskim primerom določimo dejanski tip. Na ta način zagotavljamo tudi ponovno uporabo kode.
V # 2) Ali so generiki pomembni v Javi?
Odgovor: Da. Dejansko so generiki najpomembnejše značilnosti Jave za zagotavljanje varnosti tipa, tj.preverjanje vrste v času prevajanja.
V # 3) Kdaj je Java dodala generike?
Odgovor: Generiki so bili Javi dodani leta 2004 z J2SE 5.0 z namenom zagotoviti varnost vrste prevajalskega časa v Javi.
V # 4) Kaj je generični tip?
Odgovor: Generični tip je generični razred, vmesnik ali metoda, ki je dobavljen s parametrom tipa. To omogoča varnost tipa in ponovno uporabo kode.
V # 5) Ali lahko v Java uporabljamo generike z matriko?
Odgovor: Ne. Java ne dovoljuje generičnih nizov.
Zaključek
S tem je zaključena vadnica o generičnih izdelkih Java, ki velja za eno najpomembnejših lastnosti v zadnjih različicah Java. Uporaba Generics v programih Java zagotavlja varnost tipov in ponovno uporabo kode. Zagotavlja tudi preverjanje časa prevajanja, tako da se program ne pokvari med izvajanjem.
Java generiki pridejo prav predvsem z vmesnikom zbirk Java, o čemer bomo podrobneje razpravljali v drugi vadnici v tej seriji.
Veselo branje !!
Priporočeno branje
- 15 najboljših JAVA orodij za razvoj, izdelavo, profiliranje, pokritost kode in pregled
- Vadnica za Java Collections Framework (JCF)
- Java vrste podatkov, zanke, nizi, stikala in trditve
- Uvajanje Java: Ustvarjanje in izvajanje datoteke Java JAR
- Java izjeme in obravnava izjem z primeri
- JAVA Vadnica za začetnike: 100+ praktičnih Javnih video vadnic
- Vadnica za odsev Java s primeri
- Java 'this' ključna beseda: Vadnica s primeri kode