logo

Generics Java

Generics nozīmē parametrizētie veidi . Ideja ir ļaut tipam (vesels skaitlis, virkne utt. un lietotāja definēti tipi) būt par metožu, klašu un saskarņu parametru. Izmantojot Generics, ir iespējams izveidot klases, kas strādā ar dažādiem datu tipiem. Entītija, piemēram, klase, saskarne vai metode, kas darbojas ar parametrizētu tipu, ir vispārīga entītija.

Kāpēc Generics?

The Objekts ir visu pārējo klašu virsklase, un objekta atsauce var attiekties uz jebkuru objektu. Šīm funkcijām trūkst tipa drošības. Generics pievieno šāda veida drošības līdzekli. Mēs apspriedīsim šāda veida drošības līdzekli turpmākajos piemēros.

Java vispārīgie elementi ir līdzīgi C++ veidnēm. Piemēram, tādās klasēs kā HashSet, ArrayList, HashMap utt. ļoti labi tiek izmantoti vispārīgie vārdi. Pastāv dažas būtiskas atšķirības starp abām pieejām vispārīgajiem veidiem.



Java Generics veidi

Vispārējā metode: Vispārējā Java metode ņem parametru un pēc uzdevuma izpildes atgriež kādu vērtību. Tā ir tieši tāda pati kā parasta funkcija, tomēr vispārīgajai metodei ir tipa parametri, kas tiek citēti pēc faktiskā veida. Tas ļauj vispārīgāko metodi izmantot vispārīgākā veidā. Kompilators rūpējas par drošības veidu, kas ļauj programmētājiem viegli kodēt, jo viņiem nav jāveic garas, individuāla veida liešanas.

Vispārējās klases: Vispārējā klase tiek ieviesta tieši tāpat kā nevispārējā klase. Vienīgā atšķirība ir tā, ka tajā ir tipa parametru sadaļa. Var būt vairāk nekā viena veida parametri, kas atdalīti ar komatu. Klases, kas pieņem vienu vai vairākus parametrus, ir pazīstamas kā parametrizētās klases vai parametrizētie tipi.

Vispārējā klase

Tāpat kā C++, mēs izmantojam, lai norādītu parametru veidus vispārīgās klases izveidē. Lai izveidotu vispārīgas klases objektus, mēs izmantojam šādu sintaksi.

// To create an instance of generic class BaseType obj = new BaseType ()>

Piezīme: Parametru tipā mēs nevaram izmantot primitīvus, piemēram, 'int', 'char' vai '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());> >}> }>

>

>

Izvade

15 GeeksForGeeks>

Mēs varam arī nodot vairākus tipa parametrus vispārīgajās klasēs.

Java

unix vs Windows




// 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();> >}> }>

>

>

Izvade

GfG 15>

Vispārējās funkcijas:

Mēs varam arī rakstīt vispārīgas funkcijas, kuras var izsaukt ar dažāda veida argumentiem, pamatojoties uz vispārīgajai metodei nodoto argumentu veidu. Kompilators apstrādā katru metodi.

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>);> >}> }>

>

>

Izvade

java.lang.Integer = 11 java.lang.String = GeeksForGeeks java.lang.Double = 1.0>

Generics darbojas tikai ar atsauces veidiem:

Kad mēs deklarējam vispārīga tipa gadījumu, tipa argumentam, kas tiek nodots tipa parametram, ir jābūt atsauces tipam. Mēs nevaram izmantot tādus primitīvus datu tipus kā starpt , char.

tehnoloģiju priekšrocības un trūkumi
Test obj = new Test(20);>

Iepriekš minētā rindiņa rada kompilēšanas laika kļūdu, ko var atrisināt, izmantojot tipa iesaiņotājus, lai iekapsulētu primitīvu tipu.

Bet primitīvā tipa masīvus var nodot tipa parametram, jo ​​masīvi ir atsauces tipi.

ArrayList a = new ArrayList();>

Vispārīgie veidi atšķiras atkarībā no to veida argumentiem:

Apsveriet šādu Java kodu.

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> >}> }>

>

>

Izvade:

error: incompatible types: Test cannot be converted to Test>

Lai gan iObj un sObj ir tests, tie ir atsauces uz dažādiem veidiem, jo ​​to tipa parametri atšķiras. Ģenerālie līdzekļi ar to palielina tipa drošību un novērš kļūdas.

Ierakstiet parametrus Java Generics

Tipa parametru nosaukšanas konvencijas ir svarīgas, lai rūpīgi apgūtu vispārīgos vārdus. Parastie tipa parametri ir šādi:

10 no 60
  • T – tips
  • E – elements
  • K – atslēga
  • N – Skaitlis
  • V – Vērtība

Generics priekšrocības:

Programmām, kas izmanto Generics, ir daudz priekšrocību salīdzinājumā ar neparasto kodu.

1. Koda atkārtota izmantošana: Mēs varam vienreiz uzrakstīt metodi/klasi/interfeisu un izmantot to jebkuram vēlamajam veidam.

2. Tipa drošība: Generics rada kļūdas, parādoties kompilēšanas laikā, nevis izpildes laikā (Vienmēr ir labāk zināt koda problēmas kompilēšanas laikā, nevis likt kodam neizdoties izpildes laikā). Pieņemsim, ka vēlaties izveidot ArrayList, kurā tiek saglabāti studentu vārdi, un, ja programmētājs kļūdas dēļ pievieno vesela skaitļa objektu, nevis virkni, kompilators to atļauj. Bet, kad mēs izgūstam šos datus no ArrayList, tas rada problēmas izpildlaikā.

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>);> >}> }>

>

>

Izvade:

Exception in thread 'main' java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at Test.main(Test.java:19)>

Kā Generics atrisina šo problēmu?

Definējot ArrayList, mēs varam norādīt, ka šajā sarakstā var būt tikai String objekti.

Java


10 ml līdz oz



// 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>);> >}> }>

>

>

Izvade:

15: error: no suitable method found for add(int) al.add(10); ^>

3. Atsevišķa tipa liešana nav nepieciešama: Ja mēs neizmantojam vispārīgos vārdus, tad iepriekš minētajā piemērā katru reizi, kad izgūstam datus no ArrayList, mums tie ir jāievada tipā. Rakstu apraide katrā izguves operācijā ir lielas galvassāpes. Ja mēs jau zinām, ka mūsu sarakstā ir tikai virkņu dati, mums tas nav jāieraida katru reizi.

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 veicina koda atkārtotu izmantošanu: Izmantojot Java vispārīgos elementus, mēs varam uzrakstīt kodu, kas darbosies ar dažāda veida datiem. Piemēram,

Pieņemsim, ka mēs vēlamies kārtot dažādu datu tipu masīva elementus, piemēram, int, char, String utt.

Būtībā mums būs vajadzīgas dažādas funkcijas dažādiem datu tipiem.

Vienkāršības labad mēs izmantosim Bubble sort.

Bet izmantojot ģenēriskie līdzekļi, mēs varam sasniegt koda atkārtotas izmantošanas funkciju.

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) { //Salīdzinot datu tipus, kas nav primitīvi, //mums ir jāizmanto Comparable class //Bubble Sort loģika for (int i = 0; i 1; i++) { for (int j = 0 j 1; j++) { if (a[j].salīdzināt(a[j + 1])> 0) { apmainīt(j, j + 1, a); } } } // Elementu drukāšana pēc šķirošanas for (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; } }>

>

statisks atslēgvārds java
>

Izvade

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,>

Šeit mēs esam izveidojuši vispārīgu metodi. Šo pašu metodi var izmantot, lai veiktu darbības ar veselu skaitļu datiem, virkņu datiem un tā tālāk.

5. Vispārējo algoritmu ieviešana: Izmantojot sugas, mēs varam ieviest algoritmus, kas darbojas uz dažāda veida objektiem, un tajā pašā laikā tie ir arī tipiski droši.