Generiki pomeni parametrizirani tipi . Ideja je omogočiti, da so tipi (celo število, niz itd. in uporabniško definirani tipi) parameter za metode, razrede in vmesnike. Z uporabo Generics je mogoče ustvariti razrede, ki delujejo z različnimi vrstami podatkov. Entiteta, kot je razred, vmesnik ali metoda, ki deluje na parametriziranem tipu, je generična entiteta.
Zakaj generiki?
The Objekt je nadrazred vseh drugih razredov, sklic na objekt pa se lahko nanaša na kateri koli objekt. Te funkcije nimajo tipske varnosti. Generiki dodajo to vrsto varnostne funkcije. To vrsto varnostne funkcije bomo obravnavali v kasnejših primerih.
Generiki v Javi so podobni predlogam v C++. Na primer, razredi, kot so HashSet, ArrayList, HashMap itd., zelo dobro uporabljajo generike. Obstaja nekaj temeljnih razlik med obema pristopoma k generičnim tipom.
Vrste Java Generics
Generična metoda: Generična metoda Java sprejme parameter in vrne neko vrednost po izvedbi naloge. To je natanko tako kot običajna funkcija, vendar ima generična metoda parametre tipa, ki jih navaja dejanski tip. To omogoča, da se generična metoda uporablja na bolj splošen način. Prevajalnik skrbi za vrsto varnosti, ki programerjem omogoča preprosto kodiranje, saj jim ni treba izvajati dolgih posameznih tipskih ulitkov.
Splošni razredi: Generični razred je implementiran natanko tako kot negenerični razred. Edina razlika je v tem, da vsebuje razdelek parametrov tipa. Obstaja lahko več vrst parametrov, ločenih z vejico. Razredi, ki sprejmejo enega ali več parametrov, so znani kot parametrizirani razredi ali parametrizirani tipi.
Generični razred
Tako kot C++ uporabljamo za določanje vrst parametrov pri ustvarjanju generičnega razreda. Za ustvarjanje objektov generičnega razreda uporabljamo naslednjo sintakso.
// To create an instance of generic class BaseType obj = new BaseType ()>
Opomba: V vrsti parametrov ne moremo uporabiti primitivov, kot so 'int', 'char' ali 'double'.
Java
// Java program to show working of user defined> // Generic classes> // We use to specify Parameter type> class> Test {> > // An object of type T is declared> > T obj;> > Test(T obj) {> this> .obj = obj; }> // constructor> > public> T getObject() {> return> this> .obj; }> }> // Driver class to test above> class> Main {> > public> static> void> main(String[] args)> > {> > // instance of Integer type> > Test iObj => new> Test(> 15> );> > System.out.println(iObj.getObject());> > // instance of String type> > Test sObj> > => new> Test(> 'GeeksForGeeks'> );> > System.out.println(sObj.getObject());> > }> }> |
>
>Izhod
15 GeeksForGeeks>
V generične razrede lahko posredujemo tudi več parametrov tipa.
Java
anonimna funkcija java
// Java program to show multiple> // type parameters in Java Generics> // We use to specify Parameter type> class> Test> {> > T obj1;> // An object of type T> > U obj2;> // An object of type U> > // constructor> > Test(T obj1, U obj2)> > {> > this> .obj1 = obj1;> > this> .obj2 = obj2;> > }> > // To print objects of T and U> > public> void> print()> > {> > System.out.println(obj1);> > System.out.println(obj2);> > }> }> // Driver class to test above> class> Main> {> > public> static> void> main (String[] args)> > {> > Test obj => > new> Test(> 'GfG'> ,> 15> );> > obj.print();> > }> }> |
>
java filter tok
>Izhod
GfG 15>
Splošne funkcije:
Napišemo lahko tudi generične funkcije, ki jih lahko kličemo z različnimi vrstami argumentov glede na vrsto argumentov, posredovanih generični metodi. Prevajalnik obravnava vsako metodo.
Java
// Java program to show working of user defined> // Generic functions> class> Test {> > // A Generic method example> > static> > void> genericDisplay(T element)> > {> > System.out.println(element.getClass().getName()> > +> ' = '> + element);> > }> > // Driver method> > public> static> void> main(String[] args)> > {> > // Calling generic method with Integer argument> > genericDisplay(> 11> );> > // Calling generic method with String argument> > genericDisplay(> 'GeeksForGeeks'> );> > // Calling generic method with double argument> > genericDisplay(> 1.0> );> > }> }> |
>
>Izhod
java.lang.Integer = 11 java.lang.String = GeeksForGeeks java.lang.Double = 1.0>
Generiki delujejo samo z referenčnimi vrstami:
Ko deklariramo primerek generičnega tipa, mora biti argument tipa, posredovan parametru tipa, referenčni tip. Ne moremo uporabljati primitivnih tipov podatkov, kot je int , char.
Test obj = new Test(20);>
Zgornja vrstica ima za posledico napako med prevajanjem, ki jo je mogoče razrešiti z ovoji tipa za inkapsulacijo primitivnega tipa.
Toda nize primitivnih tipov je mogoče posredovati parametru tipa, ker so nizi referenčni tipi.
ArrayList a = new ArrayList();>
Generični tipi se razlikujejo glede na svoje tipske argumente:
Razmislite o naslednji kodi Java.
Java
// Java program to show working> // of user-defined Generic classes> // We use to specify Parameter type> class> Test {> > // An object of type T is declared> > T obj;> > Test(T obj) {> this> .obj = obj; }> // constructor> > public> T getObject() {> return> this> .obj; }> }> // Driver class to test above> class> Main {> > public> static> void> main(String[] args)> > {> > // instance of Integer type> > Test iObj => new> Test(> 15> );> > System.out.println(iObj.getObject());> > // instance of String type> > Test sObj> > => new> Test(> 'GeeksForGeeks'> );> > System.out.println(sObj.getObject());> > iObj = sObj;> // This results an error> > }> }> |
>
>
Izhod:
error: incompatible types: Test cannot be converted to Test>
Čeprav sta iObj in sObj tipa Test, sta sklicevanja na različne tipe, ker se njuni parametri tipa razlikujejo. Generiki s tem dodajo varnost tipov in preprečijo napake.
Parametri tipa v Java Generics
Dogovori o poimenovanju parametrov tipa so pomembni za temeljito učenje generičnih. Skupni parametri vrste so naslednji:
10 od 60
- T – vrsta
- E – Element
- K – ključ
- N – Število
- V – Vrednost
Prednosti generičnih zdravil:
Programi, ki uporabljajo generično kodo, imajo veliko prednosti pred negenerično kodo.
1. Ponovna uporaba kode: Metodo/razred/vmesnik lahko napišemo enkrat in ga uporabimo za katero koli vrsto, ki jo želimo.
2. Varnost tipa: Generiki povzročijo napake, da se prikažejo v času prevajanja kot v času izvajanja (Vedno je bolje poznati težave v vaši kodi v času prevajanja, namesto da povzročite, da vaša koda ne uspe med izvajanjem). Recimo, da želite ustvariti ArrayList, ki hrani imena študentov, in če programer pomotoma doda celoštevilski objekt namesto niza, prevajalnik to dovoli. Toda, ko pridobimo te podatke iz ArrayList, povzroči težave med izvajanjem.
Java
// Java program to demonstrate that NOT using> // generics can cause run time exceptions> import> java.util.*;> class> Test> {> > public> static> void> main(String[] args)> > {> > // Creatinga an ArrayList without any type specified> > ArrayList al => new> ArrayList();> > al.add(> 'Sachin'> );> > al.add(> 'Rahul'> );> > al.add(> 10> );> // Compiler allows this> > String s1 = (String)al.get(> 0> );> > String s2 = (String)al.get(> 1> );> > // Causes Runtime Exception> > String s3 = (String)al.get(> 2> );> > }> }> |
>
>
format niza java
Izhod:
Exception in thread 'main' java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at Test.main(Test.java:19)>
Kako generična zdravila rešujejo ta problem?
Ko definiramo ArrayList, lahko določimo, da lahko ta seznam sprejme samo objekte String.
Java
// Using Java Generics converts run time exceptions into> // compile time exception.> import> java.util.*;> class> Test> {> > public> static> void> main(String[] args)> > {> > // Creating a an ArrayList with String specified> > ArrayList al => new> ArrayList ();> > al.add(> 'Sachin'> );> > al.add(> 'Rahul'> );> > // Now Compiler doesn't allow this> > al.add(> 10> );> > String s1 = (String)al.get(> 0> );> > String s2 = (String)al.get(> 1> );> > String s3 = (String)al.get(> 2> );> > }> }> |
>
>
Izhod:
15: error: no suitable method found for add(int) al.add(10); ^>
3. Individualno ulivanje tipa ni potrebno: Če ne uporabljamo generikov, jih moramo v zgornjem primeru vsakič, ko pridobimo podatke iz ArrayList, tipizirati. Prevajanje tipa pri vsaki operaciji iskanja je velik glavobol. Če že vemo, da naš seznam vsebuje samo nizovne podatke, nam jih ni treba vsakič vtipkati.
Java
// We don't need to typecast individual members of ArrayList> import> java.util.*;> class> Test {> > public> static> void> main(String[] args)> > {> > // Creating a an ArrayList with String specified> > ArrayList al => new> ArrayList();> > al.add(> 'Sachin'> );> > al.add(> 'Rahul'> );> > // Typecasting is not needed> > String s1 = al.get(> 0> );> > String s2 = al.get(> 1> );> > }> }> |
>
>
4. Generics spodbuja ponovno uporabnost kode: S pomočjo generike v Javi lahko napišemo kodo, ki bo delovala z različnimi vrstami podatkov. na primer
Recimo, da želimo razvrstiti elemente matrike različnih tipov podatkov, kot so int, char, niz itd.
V bistvu bomo potrebovali različne funkcije za različne vrste podatkov.
Zaradi poenostavitve bomo uporabili Bubble sort.
Toda z uporabo Generiki, lahko dosežemo funkcijo ponovne uporabe kode.
Java
public> class> GFG {> > public> static> void> main(String[] args)> > {> > Integer[] a = {> 100> ,> 22> ,> 58> ,> 41> ,> 6> ,> 50> };> > Character[] c = {> 'v'> ,> 'g'> ,> 'a'> ,> 'c'> ,> 'x'> ,> 'd'> ,> 't'> };> > String[] s = {> 'Virat'> ,> 'Rohit'> ,> 'Abhinay'> ,> 'Chandu'> ,> 'Sam'> ,> 'Bharat'> ,> 'Kalam'> };> > System.out.print(> 'Sorted Integer array : '> );> > sort_generics(a);> > System.out.print(> 'Sorted Character array : '> );> > sort_generics(c);> > System.out.print(> 'Sorted String array : '> );> > sort_generics(s);> > > }> > public> static> extends Comparable>void sort_generics(T[] a) { //Ker primerjamo neprimitivne tipe podatkov //moramo uporabiti primerljivi razred //logiko mehurčkovega razvrščanja za (int i = 0; i 1; i++) { za (int j = 0; j++) { if (a[j].compareTo(a[j + 1]) {swap(j, j + 1, a); } } } // Tiskanje elementov po sortiranju za (T i : a) { System.out.print(i + ', '); } System.out.println(); } public static void swap(int i, int j, T[] a) { T t = a[i]; a[i] = a[j]; a[j] = t; } }> |
>
Neena Gupta
>Izhod
Sorted Integer array : 6, 22, 41, 50, 58, 100, Sorted Character array : a, c, d, g, t, v, x, Sorted String array : Abhinay, Bharat, Chandu, Kalam, Rohit, Sam, Virat,>
Tukaj smo ustvarili generično metodo. To isto metodo je mogoče uporabiti za izvajanje operacij na celih podatkih, podatkih nizov itd.
5. Implementacija generičnih algoritmov: Z uporabo generikov lahko implementiramo algoritme, ki delujejo na različnih vrstah objektov, hkrati pa so tudi tipsko varni.