Generiske legemidler midler parameteriserte typer . Ideen er å la type (heltall, streng, … etc., og brukerdefinerte typer) være en parameter for metoder, klasser og grensesnitt. Ved å bruke Generics er det mulig å lage klasser som fungerer med ulike datatyper. En enhet som klasse, grensesnitt eller metode som opererer på en parameterisert type er en generisk enhet.
Hvorfor generiske legemidler?
De Gjenstand er superklassen til alle andre klasser, og objektreferanse kan referere til ethvert objekt. Disse funksjonene mangler typesikkerhet. Generikk legger til den typen sikkerhetsfunksjon. Vi vil diskutere den typen sikkerhetsfunksjoner i senere eksempler.
Generikk i Java ligner på maler i C++. For eksempel, klasser som HashSet, ArrayList, HashMap, etc., bruker generikk veldig godt. Det er noen grunnleggende forskjeller mellom de to tilnærmingene til generiske typer.
Typer Java Generics
Generisk metode: Generisk Java-metode tar en parameter og returnerer en viss verdi etter å ha utført en oppgave. Det er akkurat som en vanlig funksjon, men en generisk metode har typeparametere som er sitert etter faktisk type. Dette gjør at den generiske metoden kan brukes på en mer generell måte. Kompilatoren tar seg av typen sikkerhet som gjør det mulig for programmerere å kode enkelt siden de ikke trenger å utføre lange, individuelle typestøpinger.
Generiske klasser: En generisk klasse implementeres nøyaktig som en ikke-generisk klasse. Den eneste forskjellen er at den inneholder en type parameterseksjon. Det kan være mer enn én type parameter, atskilt med komma. Klassene, som aksepterer en eller flere parametere, er kjent som parameteriserte klasser eller parameteriserte typer.
Generisk klasse
Som C++ bruker vi til å spesifisere parametertyper i generisk klasseoppretting. For å lage objekter av en generisk klasse bruker vi følgende syntaks.
// To create an instance of generic class BaseType obj = new BaseType ()>
Merk: I parametertype kan vi ikke bruke primitiver som 'int', 'char' eller '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());> > }> }> |
>
>Produksjon
15 GeeksForGeeks>
Vi kan også sende flere Type-parametere i generiske klasser.
Java
c-program for todimensjonal array
// 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();> > }> }> |
>
>Produksjon
GfG 15>
Generiske funksjoner:
Vi kan også skrive generiske funksjoner som kan kalles med ulike typer argumenter basert på typen argumenter som sendes til den generiske metoden. Kompilatoren håndterer hver metode.
ascii tabell java
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> );> > }> }> |
>
>Produksjon
java.lang.Integer = 11 java.lang.String = GeeksForGeeks java.lang.Double = 1.0>
Generika fungerer bare med referansetyper:
Når vi erklærer en forekomst av en generisk type, må typeargumentet som sendes til typeparameteren være en referansetype. Vi kan ikke bruke primitive datatyper som int , røye.
Test obj = new Test(20);>
Linjen ovenfor resulterer i en kompileringstidsfeil som kan løses ved å bruke typeomslag for å innkapsle en primitiv type.
Men matriser av primitive type kan sendes til typeparameteren fordi matriser er referansetyper.
ArrayList a = new ArrayList();>
Generiske typer er forskjellige basert på deres typeargumenter:
Tenk på følgende Java-kode.
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> > }> }> |
>
>
Produksjon:
error: incompatible types: Test cannot be converted to Test>
Selv om iObj og sObj er av typen Test, er de referansene til forskjellige typer fordi deres typeparametere er forskjellige. Generikk legger til typesikkerhet gjennom dette og forhindrer feil.
Skriv inn parametere i Java Generics
Navnekonvensjonene for typeparametere er viktige for å lære generikk grundig. De vanlige typeparametrene er som følger:
er lik streng i java
- T – Type
- E – Element
- K – Nøkkel
- N – Antall
- V – Verdi
Fordeler med generiske legemidler:
Programmer som bruker Generics har mange fordeler fremfor ikke-generisk kode.
1. Gjenbruk av kode: Vi kan skrive en metode/klasse/grensesnitt én gang og bruke den for hvilken som helst type vi ønsker.
2. Type sikkerhet: Generiske brukere gjør feil for å vises kompileringstidspunkt enn ved kjøretid (det er alltid bedre å kjenne til problemer i koden din på kompileringstidspunktet i stedet for å få koden til å mislykkes under kjøretid). Anta at du vil lage en ArrayList som lagrer studentenes navn, og hvis programmereren ved en feiltakelse legger til et heltallsobjekt i stedet for en streng, tillater kompilatoren det. Men når vi henter disse dataene fra ArrayList, forårsaker det problemer under kjøring.
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> );> > }> }> |
>
>
Utgang:
tallene i alfabetet
Exception in thread 'main' java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at Test.main(Test.java:19)>
Hvordan løser generiske medisiner dette problemet?
Når vi definerer ArrayList, kan vi spesifisere at denne listen bare kan ta String-objekter.
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> );> > }> }> |
>
>
Produksjon:
15: error: no suitable method found for add(int) al.add(10); ^>
3. Individuell type casting er ikke nødvendig: Hvis vi ikke bruker generiske stoffer, må vi, i eksemplet ovenfor, hver gang vi henter data fra ArrayList, typecaste det. Typecasting ved hver henting er en stor hodepine. Hvis vi allerede vet at listen vår bare inneholder strengdata, trenger vi ikke typecaste den hver gang.
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 fremmer gjenbrukbarhet av kode: Ved hjelp av generikk i Java kan vi skrive kode som vil fungere med ulike typer data. For eksempel,
La oss si at vi vil sortere array-elementene til forskjellige datatyper som int, char, String etc.
I utgangspunktet vil vi trenge forskjellige funksjoner for forskjellige datatyper.
For enkelhets skyld bruker vi Bubble sort.
Men ved å bruke Generiske legemidler, vi kan oppnå funksjonen for gjenbruk av 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) { //Når vi sammenligner de ikke-primitive datatypene //må vi bruke sammenlignbar klasse //Bubble Sort logic for (int i = 0; i 1; i++) { for (int j = 0; j 1; j++) { if (a[j].compareTo(a[j + 1])> 0) { swap(j, j + 1, a); } } } // Skriver ut elementene etter sortert 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; } }> |
>
gyldige identifikatorer i java
>Produksjon
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,>
Her har vi laget en generisk metode. Den samme metoden kan brukes til å utføre operasjoner på heltallsdata, strengdata og så videre.
5. Implementering av generiske algoritmer: Ved å bruke generikk kan vi implementere algoritmer som fungerer på forskjellige typer objekter, og samtidig er de typesikre også.