java generics tutorial with examples
Generika jazyka Java je súbor funkcií, ktoré vám umožňujú písať kód nezávisle na dátovom type. Tento článok podrobne vysvetľuje Java Generics s príkladmi:
Generiká sú jednou z dôležitých funkcií Javy a boli zavedené od Javy 5 a ďalej.
Podľa definície sú Generics súhrn funkcií jazyka Java, ktoré umožňujú programátorovi používať všeobecné typy a funkcie, a tým zaisťujú bezpečnosť typov.
najlepsi web s prevodnikom z youtube na mp3
Čo sa dozviete:
Ako fungujú generiká v Jave?
Ak ste predtým pracovali s C ++, potom Java Generics je to isté ako šablóny v C ++. Java Generics vám umožňuje zahrnúť do definície triedy / metódy parameter, ktorý bude mať hodnotu primitívneho údajového typu.
Napríklad, môžete mať generickú triedu „Array“ takto:
Pole triedy {….}
Kde je parametrizovaný typ.
Ďalej môžete pre túto triedu vytvárať objekty nasledovne:
Array int_array = new Array () Array char_array = new Array ();
Takže vzhľadom na generickú parametrizovanú triedu môžete ako parametre vytvárať objekty tej istej triedy s rôznymi dátovými typmi. Toto je hlavná podstata používania Java Generics.
Podobne môžete napísať všeobecnú metódu s parametrizovaným typom na triedenie poľa a potom vytvoriť inštanciu tejto metódy pre akýkoľvek primitívny typ.
Java Generics sa väčšinou používajú v rámci kolekcií Java. Rôzne zbierky ako LinkedList, List, Map, HashMap atď. Používajú na implementáciu generické. Generiká poskytujú bezpečnosť typu, pretože kontrola typu sa vykonáva v čase kompilácie, čím sa zvyšuje stabilita vášho kódu.
Pozrime sa teraz podrobnejšie na všeobecné triedy a metódy, ako aj na ďalšie súvisiace témy.
Generické triedy
Obecná trieda je rovnaká ako normálna trieda, až na to, že za názvom triedy nasleduje typ v hranatých zátvorkách.
Všeobecná definícia generickej triedy je nasledovná:
trieda class_name
{
premenné triedy;
… ..
triedne metódy;
}
Po definovaní triedy môžete vytvárať objekty ľubovoľného údajového typu nasledujúcim spôsobom:
class_name obj = new class_name ();
Napríklad, pre objekt Integer bude vyhlásenie:
class_name obj = new class_name;
Podobne pre dátový typ String bude objekt:
class_name str_Obj = new class_name;
Nižšie je uvedená príklad implementácie pre generickú triedu.
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()); } }
Výkon:
Vo vyššie uvedenom programe je trieda MyGenericClass všeobecnou triedou. Má dve metódy, t. J. Pridať a získať. Pridanie metódy inicializuje všeobecný objekt, zatiaľ čo metódy get vrátia objekt.
V hlavnej funkcii deklarujeme dva objekty typu Integer a String. Oba tieto objekty inicializujeme s ich príslušnými počiatočnými hodnotami pomocou metódy add a potom výstup obsahu týchto objektov vykonáme pomocou metódy get.
Vyššie sme predstavili príklad triedy Generic s jedným parametrom typu. Ale v skutočnosti môže mať trieda tiež viac ako jeden parameter typu. V takom prípade sú parametre typu oddelené čiarkou.
Nasledujúci príklad to demonštruje:
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(); } }
Výkon:
V tomto programe máme dva parametre typu, tj. T1 a T2. Máme funkcie na inicializáciu členských objektov a tiež na tlač obsahu. V hlavnej funkcii deklarujeme objekt s dvoma typmi, tj. String a Integer. Výstup programu zobrazuje obsah vytvoreného objektu.
Rovnako ako triedy, aj vy môžete mať všeobecné rozhranie. Všetko o rozhraniach sa dozvieme v samostatnej téme.
Generické metódy Java
Rovnako ako môžete mať generické triedy a rozhrania, môžete mať aj generické metódy pre prípad, že nepotrebujete celú triedu ako generickú.
Nasledujúci program ukazuje implementáciu generickej metódy „printGenericArray“. Všimnite si volanie metódy v hlavnej funkcii. Tu uskutočňujeme dve volania všeobecnej metódy, prvýkrát pomocou typu a potom pomocou typu.
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 ); } }
Výkon:
Parametre ohraničeného typu
Parametre ohraničeného typu sa dostanú do obrazu, keď chcete obmedziť dátové typy v generike. Napríklad, ak chcete konkrétnu generickú triedu alebo metódu alebo akékoľvek rozhranie, ktoré by malo fungovať iba pre číselné dátové typy, môžete to určiť pomocou kľúčového slova „extends“.
Toto je zobrazené nižšie:
List myList = new ArrayList(); List list1 = new ArrayList();
Vyššie uvedené dve deklarácie bude kompilátor akceptovať, pretože Long a Integer sú podtriedami Number.
Nasledujúce vyhlásenie však bude mať problém.
List list = new ArrayList();
Toto spôsobí chybu v čase kompilácie, pretože reťazec nie je číslo. Symbol „?“ Vo vyššie uvedenom príklade je známy ako zástupný znak a budeme o ňom diskutovať ďalej.
Všeobecne sa teda parametre ohraničeného typu používajú, ak chcete obmedziť dátové typy, ktoré sa majú použiť vo vašom generickom kóde.
Zástupný znak Java Generics
V jazyku Java je zástupný znak označený otáznikom „?“, Ktorý sa používa na označenie neznámeho typu. Zástupné znaky sa väčšinou používajú s generikami ako typ parametra.
Pri použití všeobecných zástupných znakov si musíte pamätať jeden bod, že aj keď je objekt nadtriedou všetkých ostatných tried, kolekcia objektov ( Napríklad, List) nie je nadtriedou všetkých ostatných zbierok.
Okrem toho, že sa používa ako typ parametra, môžete použiť zástupný znak ako pole, lokálnu premennú a podobne. Zástupný znak však nikdy nemôžete použiť ako supertyp alebo argument typu na vyvolanie generickej metódy alebo v prípade vytvorenia inštancie generickej triedy.
Existuje veľa príkladov parametrizovaných typov zástupných znakov (tu je najmenej jeden argument typu zástupný znak), ako je uvedené nižšie, a zástupné znaky použité na rôznych miestach sa budú interpretovať odlišne:
- Zbierka <: Kolekcia označuje všetky inštancie rozhrania kolekcie bez ohľadu na použitý argument typu.
- Zoznam extends Number< : Zoznam predstavuje všetky typy zoznamov, kde typom prvku bude číslo.
- Komparátor: Všetky inštancie porovnávacieho rozhrania pre argumenty typu, ktoré sú Stringsupertypes.
Upozorňujeme, že zástupný typ parametrického zástupného znaku je pravidlo, ktoré sa ukladá na rozpoznanie platných typov. Nejde o konkrétny dátový typ. Všeobecné zástupné znaky môžu byť ohraničené alebo neviazané.
# 1) Neviazané zástupné znaky
V neobmedzených zástupných znakoch neexistujú žiadne obmedzenia pre typové premenné a označuje sa takto:
ArrayList mylist = new ArrayList(); ArrayList my_strList = new ArrayList();
# 2) Ohraničené zástupné znaky
Už sme diskutovali o ohraničených typoch. Týmto sa obmedzujú dátové typy použité na vytvorenie inštancie parametrov typu pomocou kľúčových slov - extends alebo super. Tieto zástupné znaky je možné ďalej rozdeliť na horné ohraničené zástupné znaky a dolné ohraničené zástupné znaky.
- Horné ohraničené zástupné znaky
Ak chcete, aby bol váš všeobecný výraz platný pre všetky podtriedy daného typu, zadajte zástupný znak Horné ohraničenie s rozšírením kľúčového slova.
Napríklad, Predpokladajme, že požadujete všeobecnú metódu, ktorá podporuje zoznam, zoznam atď., a potom môžete určiť zástupný znak s horným ohraničením Zoznam . Pretože Number je nadtrieda, bude táto všeobecná metóda fungovať pre všetky jej podtriedy.
Nasledujúci program to demonštruje.
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)); } }
Výkon:
Tu sme poskytli horný ohraničený zástupný znak, zoznam argumentu typu funkcie „sumarizácia“. V hlavnej funkcii definujeme dva zoznamy, tj. Int_list typu Integer a doubles_list typu Double. Pretože Integer a Double sú podtriedami Number, súčet funkcií funguje perfektne na oboch týchto zoznamoch.
- Zástupné znaky s dolnými hranicami
Ak chcete, aby všeobecný výraz akceptoval všetky nadtriedy konkrétneho typu, môžete pre argument typu zadať zástupný znak s dolným ohraničením.
Nižšie je uvedená príkladná implementácia:
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); } }
Výkon:
selénový webdriver s uhorkou napríklad v zatmení
V tomto programe je zadaný zástupný znak Dolného ohraničenia „Zoznam“. Potom v hlavnej funkcii máme zoznam typov a zoznam. Pretože sme použili zástupný znak Lower Bounded, trieda Number je nadtriedou Integer a je platným argumentom typu.
Výhody generík Java
# 1) Typ bezpečnosti
Generiká zaisťujú bezpečnosť typu. To znamená, že kontrola typu sa vykonáva skôr v čase kompilácie ako v čase behu. Neexistuje teda šanca na získanie „ClassCastException“ počas behu, pretože sa použijú správne typy.
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); } }
Vo vyššie uvedenom programe máme dva zoznamy, jeden bez všeobecných a druhý so všeobecnými. V negenerickom zozname nie je Type Type. Ako prvok môžete pridať celé číslo, reťazec atď., Ktoré sú akceptované.
Do všeobecného zoznamu môžete pridať iba jeden typ prvku, ktorý je uvedený vo všeobecnom výraze. Ak sa pokúsite pridať prvok iného typu, výsledkom bude chyba v čase kompilácie.
Vo vyššie uvedenom programe bliká chyba kompilácie na riadku:
list.add('10');
# 2) Opätovná použiteľnosť kódu
Ak používate Generics, nemusíte písať samostatný kód pre každý typ údajov. Môžete napísať jednu triedu alebo metódu atď. A použiť ju pre všetky dátové typy.
# 3) Nie je potrebné Typecasting
Pretože používate Generics, kompilátor vie o použitých druhoch, potom nie je potrebné obsadenie.
Zvážte nasledujúci kód:
List mylist = new ArrayList(); mylist.add('Java'); String mystr = (String) list.get(0); //typecasting required
Ako vidíte, keď sa používa normálny zoznam, je potrebné typický prvok zoznamu obsadiť vhodným typom tak, ako sa to robí pre mystr vyššie.
Teraz napíšeme rovnaký kód znova so všeobecným zoznamom.
List list = new ArrayList(); list.add('Java'); String mystr = list.get(0);
Tu sme zadali typ reťazca ako všeobecný výraz pre deklaráciu zoznamu. Na získanie jednotlivých prvkov tohto zoznamu teda nepotrebujeme obsadenie.
# 4) Implementujte všeobecné algoritmy
Ak na kódovanie použijete generické algoritmy, môžete implementovať oveľa viac všeobecných algoritmov.
# 5) Kontrola času kompilácie
Ako už bolo spomenuté, keď používate program Generics vo svojom programe Java, kompilátor skontroluje typy v čase kompilácie, čím zabráni abnormálnemu ukončeniu programu za behu programu.
často kladené otázky
Otázka 1) Prečo používame v Jave generické lieky?
Odpoveď: Generiká zabezpečujú typovú nezávislosť, t. J. Môžeme poskytnúť parameter typu pri definovaní triedy / rozhrania / metódy atď., Aby sme počas skutočnej inštancie mohli určiť skutočný typ. Týmto spôsobom poskytujeme aj opätovné použitie kódu.
Otázka 2) Sú v Jave dôležité generiká?
Odpoveď: Áno. V skutočnosti sú generiká najdôležitejšími vlastnosťami Java na zaistenie bezpečnosti typu, t. J. Kontrola typu v čase kompilácie.
Otázka 3) Kedy Java pridala Generiká?
Odpoveď: Generiká boli do Javy pridané v roku 2004 s J2SE 5.0 so zámerom zaistiť bezpečnosť typu kompilácie v Jave.
Otázka č. 4) Čo je to generický typ?
Odpoveď: Všeobecný typ je všeobecná trieda, rozhranie alebo metóda, ktorá je vybavená parametrom typu. Toto umožňuje typovú bezpečnosť a opätovné použitie kódu.
Otázka č. 5) Môžeme použiť Generics s Array v Jave?
Odpoveď: Nie. Java neumožňuje generické polia.
Záver
Týmto sa končí tutoriál o generikách jazyka Java, ktorý je považovaný za jednu z najdôležitejších funkcií posledných verzií Java. Použitie programu Generics v programoch Java zaisťuje bezpečnosť typu aj opätovné použitie kódu. Zaisťuje tiež kontrolu kompilácie, aby sa program za behu nezlomil.
Generiky jazyka Java prídu vhod hlavne s rozhraním zbierok Java, o ktorých sa podrobne rozprávame v ďalšom návode v tejto sérii.
Príjemné čítanie !!
Odporúčané čítanie
- 15 najlepších nástrojov JAVA na vývoj, zostavovanie, profilovanie, pokrytie kódu a kontrolu
- Výukový program Java Collections Framework (JCF)
- Java dátové typy, slučky, polia, prepínače a tvrdenia
- Nasadenie Java: Vytvorenie a vykonanie súboru Java JAR
- Výnimky Java a spracovanie výnimiek s príkladmi
- Výukový program JAVA pre začiatočníkov: viac ako 100 praktických výučbových programov Java Video
- Výukový program Java Reflection s príkladmi
- Java „toto“ kľúčové slovo: Výukový program s príkladmi kódu