Čo je generika v jazyku Java?

Generics v Jave bol predstavený už v roku 2004 ako nová funkcia programovacieho jazyka Java a bol súčasťou vydania JDK 5. Najčastejšie sa používa spolu s rámcom kolekcií Java. Od dnešného dňa je to jedna z najvýznamnejších a najvyhľadávanejších funkcií programovacieho jazyka Java.

Generickú Javu našli štyria jednotlivci, konkrétne Gilad Bracha, Martin Oderský, David Stoutamire a Philip Wadler v roku 1998. Bolo to rozšírenie jazyka Java, ktoré podporovalo generické typy. Účelom bolo dosiahnuť dva hlavné ciele, ktorými sú:

  1. Bezpečnosť typu
  2. Opätovné použitie kódu

Definícia generík v Jave

Generiká môžu byť definované ako spôsob dosiahnutia opakovanej použiteľnosti kódu definovaním generických tried, rozhraní, konštruktorov a metód, ktoré môžu byť použité s rôznymi dátovými typmi, a tiež dosiahnuť typovú bezpečnosť deklarovaním typu údajov, ktoré sa používajú pri implementácii vopred, čím sa eliminuje šance na chybu za behu.

Ako sa generiká implementujú v jazyku Java?

Generiká sú implementované pomocou uhlových zátvoriek “”. V zátvorkách sú uvedené parametre typu „T“. Príklad, . Parameter typu „T“ je držiak miesta, ktorý naznačuje, že mu bude v čase vykonávania pridelený typ údajov. Napríklad generická trieda bude definovaná ako:

public class MyGenericClass (…)

Nasledujú parametre štandardného typu:

  • T: Typ
  • E: Element
  • N: Číslo
  • K: Kľúč
  • V: Hodnota

S, U, V atď. Sa používajú na definovanie druhého, tretieho a štvrtého parametra v prípade použitia viacerých parametrov.

Pochopenie generík v jazyku Java

V súčasnosti by vás zaujímalo, čo je typová bezpečnosť a ako to funguje? Alebo ako sa líšia generické triedy, rozhrania, konštruktory a metódy od našich bežných tried a metód, vďaka ktorým sú opakovane použiteľné? Poďme zistiť.

Java, ktorá je staticky napísaným jazykom, vyžaduje, aby ste pred jej použitím deklarovali „typ“, ktorý je dátovým typom hodnoty, ktorú má premenná.

Príklad: String myString =”eduCBA”;

Tu je „String“ typ údajov, „myString“ je premenná, ktorá bude držať hodnotu, ktorej typ je String.

Ak sa teraz pokúsite odovzdať booleovskú hodnotu namiesto reťazca, napríklad:

String myBooleanStr = true;

Okamžite dostanete chybu pri kompilácii, v ktorej sa uvádza správa „Nesúlad typu: nemožno prevádzať z booleovského reťazca na reťazec“.

Ako dosiahneme opakovanú použiteľnosť kódu s generikami?

Teraz definujme bežnú metódu:

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

Túto metódu je možné vyvolať iba odovzdaním parametra reťazca. Napríklad:

welcome(“eduCBA”);

Jeho výstupom bude „vitajte na eduCBA“.

Túto metódu však nemôžete uplatniť tak, že obídete iné typy údajov, ako napríklad celé číslo alebo logické číslo. Ak sa o to pokúsite, zobrazí sa výzva na zadanie chyby pri kompilácii s uvedením „Metóda uvítania (String) typu Runner nie je použiteľná pre argumenty (boolean)“. To znamená, že nemôžete preniesť žiadny iný typ údajov na metódu, ktorá ako parameter akceptuje iba reťazec.

To tiež znamená, že ak chcete vyvolať podobnú metódu pre iný typ údajov, budete musieť napísať novú metódu, ktorá akceptuje požadovaný typ údajov ako parameter. Táto vlastnosť metód prepisovania s parametrami rôznych typov údajov je známa aj ako preťaženie metód. Hlavnou nevýhodou tohto postupu je zväčšenie veľkosti kódu.

Generics by sme však mohli použiť aj na prepisovanie vyššie uvedenej metódy a jej použitie pre akýkoľvek požadovaný typ údajov.

Definovanie všeobecnej metódy:

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

Poznámka : Tu „t“ je objekt typu T. T sa priradí typ údajov, ktorý sa používa na vyvolanie metódy.

Teraz môžete túto metódu znova použiť tak, že ju v prípade potreby vyvoláte pre reťazec, booleovské číslo alebo celé číslo alebo akýkoľvek iný typ údajov.

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

Vyššie uvedené vyhlásenia poskytnú nižšie uvedený výstup:

Je to Educa
Je to 1
To je pravda

Preto pomocou tu použitých generík sme schopní znovu použiť našu metódu pre rôzne typy údajov.

Ako dosiahneme bezpečnosť typu pomocou generík?

Jedným z hlavných rozdielov medzi poľami a zbierkou je to, že polia dokážu ukladať iba homogénne údaje, zatiaľ čo zbierky môžu ukladať heterogénne údaje. To znamená, že zbierky môžu ukladať ľubovoľný užívateľom definovaný typ údajov / objekty.

POZNÁMKA: Kolekcie môžu uchovávať iba objekty (typ údajov definovaný používateľom), nie primitívny typ údajov. Aby bolo možné pracovať s primitívnymi údajmi, kolekcie typov využívajú triedy obálok.

Teraz zvážme ArrayList.

ArrayList myList = new ArrayList();

Pridajte k objektu ArrayList údaje typu String, Integer a Double.

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

Pri tlači objektu ArrayList vidíme, že má nasledujúce hodnoty: (eduCBA, 1, 5.2).

Ak teraz chcete tieto hodnoty načítať do premenných, budete ich musieť zadať.

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

V prípade, že neodpíšete text, zobrazí sa výzva na zadanie chyby pri kompilácii, ktorá uvádza „Nesúlad typu: nemožno prevádzať z objektu na reťazec“.

Z toho môžete vyvodiť záver, že pri načítavaní objektov z vášho zoznamu polí musíte ich prepísať na príslušné typy. Otázka, ktorá tu vyvstáva, je, ako budete vedieť, na aký typ údajov sa má použiť? V reálnom čase bude váš ArrayList obsahovať tisíce záznamov a typcasting na rôzne dátové typy pre každý jednotlivý objekt nebude možné. Mohli by ste skončiť s typovým prenosom na nesprávny typ údajov. Čo sa stane potom?

Tentoraz nedostanete chybu kompilácie, ale vyhodíte runtime chybu s uvedením „Výnimka v vlákne“ main ”java.lang.ClassCastException: java.lang.Integer nemožno odovzdať java.lang.String na com.serviceClasess.Runner .main (Runner.java:43) ".

Pretože nemôžeme zaručiť typ údajov nachádzajúcich sa v kolekcii (v tomto prípade ArrayList), nepovažujeme ich za bezpečné vzhľadom na typ. To je miesto, kde prichádzajú do hry generiká na zaistenie bezpečnosti typu.

Použitie ArrayList s generikami:

ArrayList myList = new ArrayList();

Všimnite si, že vo vnútri hranatých zátvoriek „“ je špecifikovaný typ String, čo znamená, že táto konkrétna implementácia ArrayList môže uchovávať iba údaje typu String. Ak sa k nemu pokúsite pridať akýkoľvek iný typ údajov, jednoducho zahodí chybu pri kompilácii. Tu ste zabezpečili, aby bol váš typ poľa ArrayList bezpečný tým, že ste vylúčili jeho šancu pridať iný typ údajov ako „String“.

Teraz, keď ste určili typ údajov, ktorý sa môže pridať do vašej zbierky pomocou generík, už ich nemusíte pri načítavaní údajov zadávať. To znamená, že svoje údaje môžete jednoducho získať tak, že napíšete:

String someStr = myList.get(0);

Ako generika v jazyku Java uľahčuje prácu?

Pomáha zaistiť bezpečnosť vašich kolekcií, aby sa zaistilo, že váš kód nesklame v dôsledku výnimky z doby vykonávania. To tiež ušetrí kodér od nutnosti písať každý objekt v kolekcii, čím sa vývoj kódu zrýchli a zjednoduší. Použitím generických tried a metód je tiež možné pri implementácii kód opätovne použiť podľa požadovaných typov údajov.

Čo ešte môžete robiť s programom Generics v jazyku Java?

Doteraz sme videli, ako môžeme dosiahnuť druhovú bezpečnosť a opakovanú použiteľnosť kódu pomocou generík. Teraz sa pozrime na ďalšie funkcie, ktoré generiká poskytujú. Oni sú:

  1. Ohraničené a viac ohraničené typy
  2. Zadajte zástupné znaky

Ohraničený typ: V prípade obmedzeného typu je typ údajov parametra ohraničený na konkrétny rozsah. Dosahuje sa to pomocou kľúčového slova „rozširuje“.

Uvažujme napríklad všeobecnú triedu s parametrom obmedzeného typu, ktorý rozširuje rozhranie Runnable:

class myGenericClass()

Teraz pri vytváraní objektu v inej triede:

myGenericClass myGen = new myGenericClass();

Vyššie uvedený príkaz sa dokonale vykoná bez akýchkoľvek chýb. To je v prípade ohraničeného typu, môžete odovzdať rovnaký typ triedy alebo jej podradený typ triedy. Typ parametra môžete tiež prepojiť s rozhraním a pri jeho vyvolaní implementovať jeho implementáciu, ako v prípade vyššie uvedeného príkladu.

Čo sa stane, keď sa pokúsite použiť iný typ parametra?

myGenericClass myGen = new myGenericClass();

Vo vyššie uvedenom prípade dostanete chybu kompilácie, v ktorej je uvedené „Viazaný nesúlad: Typ Integer nie je platnou náhradou za typcast typu myGenericClass“.

Viaceré ohraničené typy: V prípade viacerých ohraničených typov môžeme dátový typ parametra spojiť s viac ako jedným typom. Napríklad,

Class myGeneric()

V takom prípade môžete odovzdať akýkoľvek typ, ktorý rozširuje triedu Number a implementuje rozhranie Runnable. Pri použití viacerých obmedzených typov by sa však malo poznamenať niekoľko vecí:

  1. Nemôžeme rozširovať naraz viac ako jednu triedu.
  2. Môžeme rozšíriť ľubovoľný počet rozhraní naraz, čo nie je limit pre rozhrania.
  3. Názov triedy by mal byť vždy na prvom mieste, za ktorým nasleduje názov rozhrania, ak to nebude mať za následok chybu pri kompilácii.

Typ Zástupné znaky: Sú označené symbolom „?“ - otáznik. Využíva dve hlavné kľúčové slová:

sa rozširuje (na definovanie hornej hranice) a super (na definovanie dolnej hranice).

Napríklad,

ArrayList al

Tento objekt ArrayList „al“ obsahuje všetky údaje typu T a všetky jeho podtriedy.

ArrayList al

Tento objekt ArrayList „al“ obsahuje všetky údaje typu T a všetky jeho nadtriedy.

Výhody generík v Jave

1. Flexibilita : Generiká poskytujú nášmu kódu flexibilitu na prispôsobenie rôznych typov údajov pomocou generických tried a metód.

2. Údržba a opakovaná použiteľnosť kódu : Vzhľadom na generické triedy a metódy nie je potrebné kód prepisovať znovu, v prípade zmeny požiadaviek v neskoršej fáze, čo uľahčí jeho údržbu a opätovné použitie.

3. Bezpečnosť typu: Poskytuje typovú bezpečnosť do rámca zberu definovaním typu údajov, ktoré môže zber zhromažďovať vopred, a vylučuje akékoľvek šance na zlyhanie v čase vykonávania v dôsledku výnimky ClassCastException.

4. Eliminácia potreby typcastovania: Keďže už sú stanovené typy údajov, ktoré majú kolekcie v držbe, nie je potrebné ich pri načítavaní pretypovať. To znižuje dĺžku kódu a tiež znižuje úsilie kodéra.

Generické zručnosti v jazyku Java

Ak chcete pracovať s programom Generics, mali by ste sa oboznámiť so základmi jazyka Java. Mali by ste pochopiť, ako funguje kontrola typu a odlievanie typov. Je potrebná dôkladná znalosť iných konceptov, ako je preťaženie metód, vzťah medzi rodičovskými a podriadenými triedami, rozhraniami a ich implementáciami. Pri práci s rámcom zberu je tiež dôležité pochopiť rozdiel medzi primitívnymi dátovými typmi (systémovo definovaný typ údajov) a objektmi (užívateľsky definovaný typ údajov).

Prečo by sme mali používať Generics v Jave?

Pomocou generík je náš kód spravovateľnejší, pretože znižuje potrebu prepísať kód špecifický pre typ údajov vždy, keď dôjde k zmene požiadaviek. Použitím genericky ohraničeného typu by ste mohli obmedziť typ údajov a zároveň poskytnúť flexibilitu kódu definovaním jeho rozsahu. Pravdepodobnosť zlyhania vášho kódu je neskoršia, pretože poskytuje typovú bezpečnosť, takže váš kód je menej náchylný na chyby.

Rozsah pre generiká v Jave

Rozsah generík je obmedzený na čas zostavenia. To znamená, že generický koncept je použiteľný iba v čase zostavenia, ale nie v čase spustenia. Napríklad,

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

Všetky štyri vyššie uvedené vyhlásenia sú rovnaké. Umožnia pridať akýkoľvek objekt do objektu zoznamu.

záver

Generics zjednodušujú kódovanie pre kódovač. Znižuje šance na stretnutie s ClassCastException v čase vykonávania tým, že poskytuje silnú kontrolu typu. Úplne eliminuje potrebu odlievania typov, čo znamená, že sa musí písať menej kódu. Poskytuje nám to možnosť vyvinúť všeobecné algoritmy, ktoré sú nezávislé od typu údajov, s ktorými pracujú.

Odporúčané články

Toto bol návod na Čo je Generics v Jave ?. Tu sme diskutovali o schopnostiach, rozsahu, práci, porozumení a výhodách generík v Jave. Viac informácií nájdete aj v ďalších navrhovaných článkoch -

  1. Čo je spoločné rozhranie brány
  2. Ako nainštalovať Java 8
  3. čo je to mydlo
  4. Čo je to JavaScript?
  5. Java Booleans

Kategórie: