Generiske lægemidler midler parametriserede typer . Ideen er at tillade type (heltal, streng, … osv. og brugerdefinerede typer) at være en parameter for metoder, klasser og grænseflader. Ved hjælp af Generics er det muligt at oprette klasser, der arbejder med forskellige datatyper. En enhed såsom klasse, grænseflade eller metode, der opererer på en parameteriseret type, er en generisk enhed.
Hvorfor generiske lægemidler?
Det Objekt er superklassen af alle andre klasser, og objektreference kan referere til ethvert objekt. Disse funktioner mangler typesikkerhed. Generiske tilføjer den type sikkerhedsfunktion. Vi vil diskutere den type sikkerhedsfunktion i senere eksempler.
Generics i Java ligner skabeloner i C++. For eksempel bruger klasser som HashSet, ArrayList, HashMap osv. generics meget godt. Der er nogle grundlæggende forskelle mellem de to tilgange til generiske typer.
Typer af Java Generics
Generisk metode: Generisk Java-metode tager en parameter og returnerer en vis værdi efter at have udført en opgave. Det er nøjagtigt som en normal funktion, men en generisk metode har typeparametre, der er citeret efter faktisk type. Dette gør det muligt at bruge den generiske metode på en mere generel måde. Compileren tager sig af den type sikkerhed, som gør det muligt for programmører at kode let, da de ikke skal udføre lange, individuelle typestøbninger.
Generiske klasser: En generisk klasse implementeres nøjagtigt som en ikke-generisk klasse. Den eneste forskel er, at den indeholder en typeparametersektion. Der kan være mere end én type parameter, adskilt af et komma. Klasserne, som accepterer en eller flere parametre, kaldes parametriserede klasser eller parameteriserede typer.
Generisk klasse
Ligesom C++, bruger vi til at specificere parametertyper i generisk klasseoprettelse. For at oprette objekter af en generisk klasse bruger vi følgende syntaks.
// To create an instance of generic class BaseType obj = new BaseType ()>
Bemærk: I parametertype kan vi ikke bruge 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());> > }> }> |
>
>Produktion
15 GeeksForGeeks>
Vi kan også sende flere Type-parametre i generiske klasser.
Java
'murerens formel'
// 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();> > }> }> |
>
>Produktion
GfG 15>
Generiske funktioner:
Vi kan også skrive generiske funktioner, der kan kaldes med forskellige typer argumenter baseret på typen af argumenter, der sendes til den generiske metode. Compileren håndterer hver metode.
navnekonvention 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> );> > }> }> |
>
>Produktion
java.lang.Integer = 11 java.lang.String = GeeksForGeeks java.lang.Double = 1.0>
Generiske lægemidler fungerer kun med referencetyper:
Når vi erklærer en instans af en generisk type, skal typeargumentet, der sendes til typeparameteren, være en referencetype. Vi kan ikke bruge primitive datatyper som f.eks int , char.
Test obj = new Test(20);>
Ovenstående linje resulterer i en kompileringstidsfejl, der kan løses ved hjælp af typeindpakninger til at indkapsle en primitiv type.
Men arrays af primitive type kan overføres til typeparameteren, fordi arrays er referencetyper.
ArrayList a = new ArrayList();>
Generiske typer er forskellige baseret på deres typeargumenter:
Overvej 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> > }> }> |
>
>
Produktion:
error: incompatible types: Test cannot be converted to Test>
Selvom iObj og sObj er af typen Test, er de referencer til forskellige typer, fordi deres typeparametre er forskellige. Generics tilføjer typesikkerhed gennem dette og forhindrer fejl.
Indtast parametre i Java Generics
Typeparametrenes navngivningskonventioner er vigtige for at lære generiske stoffer grundigt. De almindelige typeparametre er som følger:
er lig med streng i java
- T – Type
- E – Element
- K – Nøgle
- N – Antal
- V – Værdi
Fordele ved generiske lægemidler:
Programmer, der bruger Generics, har mange fordele i forhold til ikke-generisk kode.
1. Genbrug af kode: Vi kan skrive en metode/klasse/grænseflade én gang og bruge den til enhver type, vi ønsker.
2. Typesikkerhed: Generiske koder laver fejl, så de vises kompileringstidspunkt end ved kørselstidspunktet (det er altid bedre at kende problemer i din kode på kompileringstidspunktet i stedet for at få din kode til at fejle under kørsel). Antag, at du vil oprette en ArrayList, der gemmer elevernes navne, og hvis programmøren ved en fejl tilføjer et heltalsobjekt i stedet for en streng, tillader compileren det. Men når vi henter disse data fra ArrayList, forårsager det problemer under kørsel.
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> );> > }> }> |
>
>
Output:
numrene 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 lægemidler dette problem?
Når vi definerer ArrayList, kan vi angive, at denne liste kun kan tage 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> );> > }> }> |
>
>
Produktion:
15: error: no suitable method found for add(int) al.add(10); ^>
3. Individuel støbning er ikke nødvendig: Hvis vi ikke bruger generiske stoffer, så skal vi i ovenstående eksempel, hver gang vi henter data fra ArrayList, typecaste dem. Typecasting ved hver genfindingsoperation er en stor hovedpine. Hvis vi allerede ved, at vores liste kun indeholder strengdata, behøver 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 kodegenanvendelighed: Ved hjælp af generiske artikler i Java kan vi skrive kode, der fungerer med forskellige typer data. For eksempel,
Lad os sige, at vi vil sortere array-elementerne i forskellige datatyper som int, char, String osv.
Grundlæggende vil vi have brug for forskellige funktioner til forskellige datatyper.
For nemheds skyld vil vi bruge Bubble sort.
Men ved at bruge Generiske lægemidler, vi kan opnå kodegenanvendelighedsfunktionen.
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) { //Da vi sammenligner de ikke-primitive datatyper //vi skal bruge Comparable class //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); } } } // Udskrivning af elementerne efter sorteret 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; } }> |
>
linux tastaturgenveje
>Produktion
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 lavet en generisk metode. Den samme metode kan bruges til at udføre operationer på heltalsdata, strengdata og så videre.
5. Implementering af generiske algoritmer: Ved at bruge generika kan vi implementere algoritmer, der virker på forskellige typer objekter, og samtidig er de også typesikre.