logo

Generics Javassa

Generics tarkoittaa parametroidut tyypit . Ajatuksena on sallia tyypin (kokonaisluku, merkkijono jne. ja käyttäjän määrittämät tyypit) parametrina menetelmille, luokille ja rajapinnoille. Genericsin avulla on mahdollista luoda luokkia, jotka toimivat eri tietotyypeillä. Entiteetti, kuten luokka, rajapinta tai menetelmä, joka toimii parametroidulla tyypillä, on yleinen entiteetti.

Miksi Generics?

The Esine on kaikkien muiden luokkien superluokka, ja Objektiviittaus voi viitata mihin tahansa objektiin. Näistä ominaisuuksista puuttuu tyyppiturvallisuus. Generics lisää tämän tyyppisen turvaominaisuuden. Keskustelemme tämän tyyppisistä turvaominaisuuksista myöhemmissä esimerkeissä.



Javan yleiset ominaisuudet ovat samanlaisia ​​kuin C++:n mallit. Esimerkiksi luokat, kuten HashSet, ArrayList, HashMap jne., käyttävät geneerejä erittäin hyvin. Geneerisiin tyyppeihin liittyvien kahden lähestymistavan välillä on joitain perustavanlaatuisia eroja.

Java Generics -tyypit

Yleinen menetelmä: Yleinen Java-menetelmä ottaa parametrin ja palauttaa jonkin arvon tehtävän suorittamisen jälkeen. Se on aivan kuten normaali funktio, mutta yleisellä menetelmällä on tyyppiparametreja, jotka lainataan todellisen tyypin mukaan. Tämä mahdollistaa yleisen menetelmän käytön yleisemmällä tavalla. Kääntäjä huolehtii turvallisuuden tyypistä, mikä mahdollistaa ohjelmoijien koodaamisen helposti, koska heidän ei tarvitse suorittaa pitkiä yksilöllisiä valuja.

Yleiset luokat: Yleinen luokka toteutetaan täsmälleen kuten ei-yleinen luokka. Ainoa ero on, että se sisältää tyyppiparametriosan. Parametrityyppejä voi olla useampia pilkulla erotettuina. Luokat, jotka hyväksyvät yhden tai useamman parametrin, kutsutaan parametroiduiksi luokiksi tai parametroiduiksi tyypeiksi.



Yleinen luokka

Kuten C++, käytämme parametrityyppien määrittämiseen yleisen luokan luomisessa. Luodaksemme yleisen luokan objekteja käytämme seuraavaa syntaksia.

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

Huomautus: Parametrityypissä emme voi käyttää primitiiviä, kuten 'int', 'char' tai '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());> >}> }>

>

>

Lähtö

15 GeeksForGeeks>

Voimme myös välittää useita tyyppiparametreja Generic-luokissa.

Java

merkkijonon muunnos int:ksi javassa




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

>

>

Lähtö

sanan rivitys css
GfG 15>

Yleiset toiminnot:

Voimme myös kirjoittaa yleisiä toimintoja, joita voidaan kutsua erityyppisillä argumenteilla perustuen geneeriselle menetelmälle välitettyjen argumenttien tyypeille. Kääntäjä käsittelee jokaisen menetelmän.

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

>

>

Lähtö

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

Generics toimii vain viitetyyppien kanssa:

Kun ilmoitamme yleisen tyypin esiintymän, type-parametrille välitetyn type-argumentin on oltava viitetyyppi. Emme voi käyttää primitiivisiä tietotyyppejä, kuten int , hiiltyä.

Test obj = new Test(20);>

Yllä oleva rivi johtaa käännösaikavirheeseen, joka voidaan ratkaista käyttämällä tyyppikääreitä primitiivisen tyypin kapseloimiseksi.

Mutta primitiivityyppiset taulukot voidaan välittää tyyppiparametrille, koska taulukot ovat viitetyyppejä.

ArrayList a = new ArrayList();>

Yleiset tyypit eroavat tyyppiargumenttien perusteella:

Harkitse seuraavaa Java-koodia.

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

>

>

Lähtö:

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

Vaikka iObj ja sObj ovat tyyppiä Test, ne ovat viittauksia eri tyyppeihin, koska niiden tyyppiparametrit eroavat toisistaan. Generics lisää tyyppiturvallisuutta ja ehkäisee virheitä.

Kirjoita Java Genericsissä parametrit

Tyyppiparametrien nimeämiskäytännöt ovat tärkeitä yleisten perusteiden oppimiseksi. Yleiset tyyppiparametrit ovat seuraavat:

100 km/h - mph
  • T – Tyyppi
  • E – Elementti
  • K - Avain
  • N – Numero
  • V – Arvo

Genericin edut:

Genericsiä käyttävillä ohjelmilla on monia etuja ei-yleiseen koodiin verrattuna.

1. Koodin uudelleenkäyttö: Voimme kirjoittaa menetelmän / luokan / käyttöliittymän kerran ja käyttää sitä mihin tahansa haluamaamme tyyppiin.

2. Tyyppiturvallisuus: Generics aiheuttaa virheitä näyttäessään käännösaikana kuin ajon aikana (On aina parempi tietää koodin ongelmat käännösaikana sen sijaan, että koodi epäonnistuisi ajon aikana). Oletetaan, että haluat luoda ArrayListin, joka tallentaa opiskelijoiden nimet, ja jos ohjelmoija vahingossa lisää kokonaislukuobjektin merkkijonon sijaan, kääntäjä sallii sen. Mutta kun haemme nämä tiedot ArrayLististä, se aiheuttaa ongelmia ajon aikana.

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

>

>

Lähtö:

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

Kuinka Generics ratkaisee tämän ongelman?

Kun määritetään ArrayList, voimme määrittää, että tämä luettelo voi ottaa vain String-objekteja.

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

>

>

Lähtö:

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

3. Yksilöllistä tyyppiä ei tarvita: Jos emme käytä geneerejä, meidän on yllä olevassa esimerkissä joka kerta kun haemme tietoja ArrayLististä, se on kirjoitettava. Tyyppilähetys jokaisessa hakuoperaatiossa on suuri päänsärky. Jos tiedämme jo, että luettelossamme on vain merkkijonotietoja, meidän ei tarvitse kirjoittaa sitä joka kerta.

Java

dhl merkitys




// 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 edistää koodin uudelleenkäytettävyyttä: Javan geneeristen ominaisuuksien avulla voimme kirjoittaa koodia, joka toimii erityyppisten tietojen kanssa. Esimerkiksi,

Oletetaan, että haluamme lajitella eri tietotyyppien taulukkoelementit, kuten int, char, String jne.

Pohjimmiltaan tarvitsemme erilaisia ​​toimintoja eri tietotyypeille.

Yksinkertaisuuden vuoksi käytämme Bubble sort.

Mutta käyttämällä geneeriset lääkkeet, voimme saavuttaa koodin uudelleenkäytettävyysominaisuuden.

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) { //Kun vertaamme ei-primitiivisiä tietotyyppejä //joudumme käyttämään Comparable Class //Bubble Sort -logiikkaa for (int i = 0; i 1; i++) { for (int j = 0 j 1; j++) { if (a[j].vertaa(a[j + 1])> 0) { swap(j, j + 1, a); } } } // Elementtien tulostaminen lajittelun jälkeen (T i : a) { System.out.print(i + ', '); } System.out.println(); } julkinen staattinen void swap(int i, int j, T[] a) { T t = a[i]; a[i] = a[j]; a[j] = t; } }>

>

Näyttelijä Rekha
>

Lähtö

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

Tässä olemme luoneet geneerisen menetelmän. Tätä samaa menetelmää voidaan käyttää toimintojen suorittamiseen kokonaislukudatalle, merkkijonodatalle ja niin edelleen.

5. Yleisten algoritmien käyttöönotto: Geneerejä käyttämällä voimme toteuttaa algoritmeja, jotka toimivat erityyppisillä objekteilla, ja samalla ne ovat myös tyyppiturvallisia.