logo

Generics Java

Generics reiškia parametrizuoti tipai . Idėja yra leisti tipą (Sveikasis skaičius, eilutė ir kt. ir vartotojo apibrėžtus tipus) būti metodų, klasių ir sąsajų parametru. Naudojant Generics galima sukurti klases, kurios veiktų su skirtingais duomenų tipais. Objektas, pvz., klasė, sąsaja arba metodas, veikiantis pagal parametrų tipą, yra bendras objektas.

Kodėl generiniai vaistai?

The Objektas yra visų kitų klasių superklasė, o Objekto nuoroda gali reikšti bet kurį objektą. Šioms savybėms trūksta tipo saugumo. Generics prideda tokio tipo saugos funkciją. Tokio tipo saugos funkciją aptarsime vėlesniuose pavyzdžiuose.



„Java“ bendrieji elementai yra panašūs į C++ šablonus. Pavyzdžiui, tokiose klasėse kaip „HashSet“, „ArrayList“, „HashMap“ ir kt., labai gerai naudojami bendrieji žodžiai. Yra keletas esminių skirtumų tarp dviejų požiūrių į bendruosius tipus.

Java Generics tipai

Bendras metodas: Bendrasis Java metodas paima parametrą ir grąžina tam tikrą reikšmę atlikęs užduotį. Tai lygiai taip pat, kaip įprasta funkcija, tačiau bendrasis metodas turi tipo parametrus, kurie nurodomi pagal tikrąjį tipą. Tai leidžia bendrąjį metodą naudoti bendresniu būdu. Kompiliatorius rūpinasi saugumo tipu, kuris leidžia programuotojams lengvai koduoti, nes jiems nereikia atlikti ilgų, individualaus tipo liejinių.

Bendrosios klasės: Bendroji klasė įgyvendinama lygiai taip pat, kaip ir nebendra klasė. Vienintelis skirtumas yra tas, kad jame yra tipo parametrų skyrius. Gali būti daugiau nei vieno tipo parametrai, atskirti kableliu. Klasės, kurios priima vieną ar daugiau parametrų, yra žinomos kaip parametrizuotos klasės arba parametrizuoti tipai.



Bendroji klasė

Kaip ir C++, mes naudojame parametrų tipams nurodyti kurdami bendrąsias klases. Norėdami sukurti bendrosios klasės objektus, naudojame šią sintaksę.

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

Pastaba: Parametrų tipe negalime naudoti primityvų, tokių kaip „int“, „char“ arba „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());> >}> }>

>

>

Išvestis

15 GeeksForGeeks>

Taip pat bendrosiose klasėse galime perduoti kelis tipo parametrus.

Java

makiažo produktų pavadinimas




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

>

>

Išvestis

GfG 15>

Bendrosios funkcijos:

Taip pat galime parašyti bendrąsias funkcijas, kurios gali būti iškviečiamos naudojant skirtingų tipų argumentus, atsižvelgiant į argumentų tipą, perduodamą bendrajam metodui. Kompiliatorius tvarko kiekvieną metodą.

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

mikrolitinis branduolys
>

>

Išvestis

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

Bendrieji vaistai veikia tik su nuorodų tipais:

Kai deklaruojame bendro tipo egzempliorių, tipo argumentas, perduodamas tipo parametrui, turi būti nuorodos tipas. Negalime naudoti primityvių duomenų tipų, pvz tarpt , char.

Test obj = new Test(20);>

Aukščiau pateiktoje eilutėje atsiranda kompiliavimo laiko klaida, kurią galima išspręsti naudojant tipo įvynioklius, kad būtų įdėtas primityvus tipas.

Tačiau primityvaus tipo masyvai gali būti perduoti tipo parametrui, nes masyvai yra atskaitos tipai.

ArrayList a = new ArrayList();>

Bendrieji tipai skiriasi pagal jų tipo argumentus:

Apsvarstykite šį „Java“ kodą.

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

>

>

Išvestis:

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

Nors „iObj“ ir „sObj“ yra „Test“ tipo, jie yra nuorodos į skirtingus tipus, nes skiriasi jų tipo parametrai. Generics papildo tipo saugumą ir apsaugo nuo klaidų.

Įveskite parametrus Java Generics

Tipo parametrų įvardijimo taisyklės yra svarbios norint gerai išmokti bendrųjų žodžių. Įprasti tipo parametrai yra tokie:

Java indeksas
  • T – tipas
  • E – elementas
  • K – raktas
  • N – Skaičius
  • V – Vertė

Generics privalumai:

Programos, kuriose naudojama bendroji programa, turi daug pranašumų, palyginti su nebendruoju kodu.

1. Pakartotinis kodo naudojimas: Mes galime vieną kartą parašyti metodą / klasę / sąsają ir naudoti jį bet kokiam norimam tipui.

2. Tipo sauga: Generics daro klaidas, kurios rodomos kompiliavimo metu, o ne vykdymo metu (Visada geriau žinoti kodo problemas kompiliavimo metu, o ne priversti jį sugesti vykdymo metu). Tarkime, kad norite sukurti ArrayList, kuriame būtų saugomi mokinių vardai, ir jei programuotojas per klaidą vietoj eilutės prideda sveikojo skaičiaus objektą, kompiliatorius tai leidžia. Tačiau kai gauname šiuos duomenis iš ArrayList, tai sukelia problemų vykdymo metu.

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

>

>

Išvestis:

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

Kaip generiniai vaistai išsprendžia šią problemą?

Apibrėždami ArrayList, galime nurodyti, kad šis sąrašas gali užimti tik String objektus.

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

>

java interviu klausimai

>

Išvestis:

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

3. Individualaus tipo liejimas nereikalingas: Jei nenaudojame bendrinių, tada aukščiau pateiktame pavyzdyje kiekvieną kartą, kai gauname duomenis iš ArrayList, turime juos perduoti. Tipo siuntimas kiekvienos paieškos operacijos metu yra didelis galvos skausmas. Jei jau žinome, kad mūsų sąraše yra tik eilučių duomenys, nereikės jų kiekvieną kartą siųsti.

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 skatina kodo pakartotinį naudojimą: Naudodami „Java“ bendruosius žodžius, galime parašyti kodą, kuris veiks su įvairių tipų duomenimis. Pavyzdžiui,

Tarkime, kad norime rūšiuoti įvairių duomenų tipų, tokių kaip int, char, String ir kt., masyvo elementus.

Iš esmės mums reikės skirtingų funkcijų skirtingiems duomenų tipams.

Paprastumo dėlei naudosime burbulų rūšiavimą.

Tačiau naudojant generiniai vaistai, galime pasiekti kodo pakartotinio naudojimo funkciją.

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) { //Kadangi lyginame neprimityvius duomenų tipus //turime naudoti Comparable Class //Bubble Sort logika for (int i = 0; i 1; i++) { for (int j = 0 j 1; j++) { if (a[j].palygintiTo(a[j + 1])> 0) { swap(j, j + 1, a); } } } // Elementų spausdinimas po surūšiavimo 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; } }>>

> 

java kalbos interviu klausimai