java generics tutorial with examples
Java Generics er et sæt funktioner, der giver dig mulighed for at skrive kode uafhængigt af datatypen. Denne artikel forklarer Java Generics i detaljer med eksempler:
Generics er en af de vigtige funktioner i Java og blev introduceret fra Java 5 og fremefter.
Generisk er pr. Definition et sæt Java-sprogfunktioner, der gør det muligt for programmøren at bruge generiske typer og funktioner og dermed sikre typesikkerhed.
Hvad du vil lære:
Hvordan fungerer generics i Java?
Hvis du har arbejdet med C ++ før, er Java Generics det samme som skabeloner i C ++. Java Generics giver dig mulighed for at medtage en parameter i din klasse / metodedefinition, der har værdien af en primitiv datatype.
For eksempel, du kan have en generisk klasse 'Array' som følger:
Klassearray {….}
Hvor er den parametriserede type.
Dernæst kan du oprette objekter til denne klasse som følger:
Array int_array = new Array () Array char_array = new Array ();
Så givet en generisk parametreret klasse kan du oprette objekter af samme klasse med forskellige datatyper som parametre. Dette er hoved essensen af at bruge Java Generics.
På samme måde kan du skrive en generisk metode med en parametreret type til at sortere en matrix og derefter instantiere denne metode til enhver primitiv type.
Java Generics bruges for det meste med Java-samlerammen. De forskellige samlinger som LinkedList, List, Map, HashMap osv. Bruger Generics til implementering. Generics giver typesikkerhed, da typekontrollen udføres på kompileringstidspunktet, hvilket gør din kode mere stabil.
Lad os nu se nærmere på detaljerne i generiske klasser og metoder samt andre relaterede emner.
Generiske klasser
En generisk klasse er den samme som en normal klasse, bortset fra at klassenavnet efterfølges af en type i kantede parenteser.
En generel definition af en generisk klasse er som følger:
klasse klasse_navn
{
klassevariabler
… ..
klassemetoder
}
Når klassen er defineret, kan du oprette objekter af en hvilken som helst datatype, du ønsker, som følger:
class_name obj = new class_name ();
For eksempel, for heltal objekt erklæringen vil være:
class_name obj = new class_name;
Tilsvarende for objektet String vil objektet være:
class_name str_Obj = new class_name;
Et eksempel på implementering for klassen Generic er vist nedenfor.
class MyGenericClass { T obj; void add(T obj) { this.obj=obj; } T get() { return obj; } } class Main { public static void main(String args()) { MyGenericClass m_int=new MyGenericClass(); m_int.add(2); MyGenericClassmstr=new MyGenericClass(); mstr.add('SoftwaretestingHelp'); System.out.println('Member of MyGenericClass:' + m_int.get()); System.out.println('Member of MyGenericClass:' + mstr.get()); } }
Produktion:
I ovenstående program er en klasse MyGenericClass en generisk klasse. Det har to metoder, dvs. tilføj og få. Metoden tilføj initialiserer det generiske objekt, mens get-metoderne returnerer objektet.
I hovedfunktionen erklærer vi to objekter af heltal og strengtype hver. Vi initialiserer begge disse objekter med deres respektive startværdier ved hjælp af add-metoden og derefter output indholdet af disse objekter ved hjælp af get-metoden.
Vi præsenterede generisk klasseeksempel ovenfor med en type parameter. Men i virkeligheden kan en klasse også have mere end en type parameter. I dette tilfælde adskilles typeparametrene med et komma.
Følgende eksempel viser dette:
classTest_Generics { T1 obj1; // An object of type T1 T2 obj2; // An object of type T2 // constructor to initialise T1 & T2 objects Test_Generics(T1 obj1, T2 obj2) { this.obj1 = obj1; this.obj2 = obj2; } public void print() { System.out.println('T1 Object:' + obj1); System.out.println('T2 Object:' + obj2); } } class Main { public static void main (String() args) { Test_Genericsobj = newTest_Generics('Java Generics', 1); obj.print(); } }
Produktion:
I dette program har vi to typeparametre, dvs. T1 og T2. Vi har funktioner til at initialisere medlemsobjekterne og også til at udskrive indholdet. I hovedfunktionen erklærer vi et objekt med to typer, dvs. streng og heltal. Programmets output viser indholdet af det oprettede objekt.
Ligesom klasser kan du også have generiske grænseflader. Vi lærer alt om grænseflader i et separat emne.
Java generiske metoder
Ligesom du kan have generiske klasser og grænseflader, kan du også have generiske metoder, hvis du ikke har brug for en hel klasse for at være generisk.
Følgende program viser implementeringen af den generiske metode “printGenericArray”. Bemærk metodeopkaldet i hovedfunktionen. Her foretager vi to opkald til den generiske metode, første gang med type og derefter med type.
public class Main{ public static void printGenericArray(T() items) { for ( T item : items){ System.out.print(item + ' '); } System.out.println(); } public static void main( String args() ) { Integer() int_Array = { 1, 3, 5, 7, 9, 11 }; Character() char_Array = { 'J', 'A', 'V', 'A', 'T','U','T','O','R','I','A', 'L','S' }; System.out.println( 'Integer Array contents:' ); printGenericArray(int_Array ); System.out.println( 'Character Array contents:' ); printGenericArray(char_Array ); } }
Produktion:
Begrænsede typeparametre
Parametre for afgrænset type kommer ind i billedet, når du vil begrænse datatyperne i Generics. For eksempel, Hvis du vil have en bestemt generisk klasse eller metode eller en hvilken som helst grænseflade, der kun skal fungere for numeriske datatyper, kan du angive det ved hjælp af nøgleordet 'udvider'.
Dette er vist nedenfor:
List myList = new ArrayList(); List list1 = new ArrayList();
Ovennævnte to erklæringer accepteres af kompilatoren, da Long og Integer er underklasser af Number.
Den næste erklæring bliver dog et problem.
List list = new ArrayList();
Dette vil give en kompileringsfejl, fordi streng ikke er et tal. Symbolet '?' I ovenstående eksempel er kendt som et jokertegn, og vi vil diskutere det næste.
Så generelt bruges afgrænsede typeparametre mest, når du vil begrænse de datatyper, der skal bruges i din generiske kode.
Java Generics jokertegn
I Java betegnes et jokertegn med et spørgsmålstegn, '?', Der bruges til at henvise til en ukendt type. Jokertegn bruges for det meste med generiske stoffer som parametertype.
java kodning interview spørgsmål skrive kode
Når du bruger Generiske jokertegn, skal du huske et punkt, at selv om objektet er superklassen i alle andre klasser, er indsamlingen af objekter ( For eksempel, List) er ikke en superklasse af alle andre samlinger.
Udover at blive brugt som en parametertype, kan du bruge et jokertegn som et felt, en lokal variabel og som sådan. Du kan dog aldrig bruge et wildcard som en supertype eller som et typeargument til at påkalde generisk metode eller i tilfælde af oprettelse af en forekomst af en generisk klasse.
Der er mange eksempler på parametriserede wildcard-typer (her er mindst et typeargument et wildcard) som vist nedenfor, og de wildcards, der bruges forskellige steder, fortolkes forskelligt:
- Kollektion <: Samling betegner al indsamlingsgrænseflade-instantiering uanset typen anvendt argument.
- Liste extends Number< : Liste repræsenterer alle listetyper, hvor elementtypen vil være et tal.
- Komparator: Alle komparatorgrænsefladesinstanseringer for typeargumenter, der er Stringsupertypes.
Bemærk, at en Wildcard Parameterized type er en regel, der pålægges for at genkende gyldige typer. Det er ikke en konkret datatype. Generiske jokertegn kan være afgrænset eller ubegrænset.
# 1) Ubegrænsede jokertegn
I ubegrænsede jokertegn er der ingen begrænsninger for typevariabler og betegnes som følger:
ArrayList mylist = new ArrayList(); ArrayList my_strList = new ArrayList();
# 2) Afgrænsede jokertegn
Vi har allerede diskuteret afgrænsede typer. Disse sætter begrænsningerne for den datatype, der bruges til at instantiere typeparametrene ved hjælp af nøgleordene - extends eller super. Disse wildcards kan yderligere opdeles i Upper Bounded Wildcards og Lower Bounded Wildcards.
- Øvre afgrænsede jokertegn
Hvis du vil have, at dit generiske udtryk skal være gyldigt for alle underklasser af en given type, skal du angive det øvre afgrænsede jokertegn med nøgleordet udvides.
For eksempel, Antag at du har brug for en generisk metode, der understøtter Liste, Liste osv., så kan du angive et Upper Bounded Wildcard som Liste . Da Number er en superklasse, fungerer denne generiske metode for alle dens underklasser.
Det følgende program demonstrerer dette.
hvordan man erklærer en række objekter i java
importjava.util.*; public class Main { private static Number summation (List numbers){ double sum = 0.0; for (Number n : numbers) sum += n.doubleValue(); return sum; } public static void main(String() args) { //Number subtype : Integer Listint_list = Arrays.asList(1,3,5,7,9); System.out.println('Sum of the elements in int_list:' + summation(int_list)); //Number subtype : Double List doubles_list = Arrays.asList(1.0,1.5,2.0,2.5,3.0,3.5); System.out.println('Sum of the elements in doubles_list:' + summation(doubles_list)); } }
Produktion:
Her har vi tilvejebragt et øvre afgrænset jokertegn, liste til typeargumentet for funktion “summering”. I hovedfunktionen definerer vi to lister, dvs. int_list af typen Heltal og double_list af typen Double. Da Integer og Double er underklasser af Number, fungerer funktionsopsummeringen perfekt på begge disse lister.
- Wildcards med lavere grænse
Hvis du vil have, at det generiske udtryk skal acceptere alle superklasser af en bestemt type, kan du angive et jævnkort med lavere afgrænsning til dit typeargument.
Et eksempel på implementering heraf gives nedenfor:
importjava.util.*; class Main { public static void main(String() args) { //Integer List ListInt_list= Arrays.asList(1,3,5,7); System.out.print('Integer List:'); printforLowerBoundedWildcards(Int_list); //Number list ListNumber_list= Arrays.asList(2,4,6,8); System.out.print('Number List:'); printforLowerBoundedWildcards(Number_list); } public static void printforLowerBoundedWildcards(List list) { System.out.println(list); } }
Produktion:
I dette program er det specificerede 'Lower Bounded Wildcard' 'List'. Så i hovedfunktionen har vi en typeliste og listen. Da vi har brugt det nedre afgrænsede jokertegn, er klassen Number en superklasse af heltal er et gyldigt argument.
Fordele ved Java Generics
# 1) Type sikkerhed
Generiske stoffer garanterer typesikkerhed. Dette betyder, at typekontrol udføres på kompileringstidspunkt snarere end på kørselstidspunktet. Således er der ingen chance for at få “ClassCastException” under kørsel, da korrekte typer vil blive brugt.
importjava.util.*; class Main { public static void main(String() args) { List mylist = new ArrayList(); mylist.add(10); mylist.add('10'); System.out.println(mylist); List list = new ArrayList(); list.add(10); list.add('10');// compile-time error System.out.println(list); } }
I ovenstående program har vi to lister, en uden generiske og en anden med generiske. På den ikke-generiske liste er der ingen typesikkerhed. Du kan tilføje et heltal, streng osv. Som et element, og det accepteres.
På den generiske liste kan du kun tilføje en type element, der er angivet i det generiske udtryk. Hvis du forsøger at tilføje et element af en anden type, resulterer det i en kompileringstidsfejl.
I ovenstående program blinker kompileringstidsfejlen ved linjen:
list.add('10');
# 2) Genanvendelighed af kode
Ved hjælp af Generics behøver du ikke skrive separat kode for hver datatype. Du kan skrive en enkelt klasse eller metode osv. Og bruge den til alle datatyper.
# 3) Intet behov for typecasting
Da du bruger Generics, ved compileren de anvendte typer, så der er ikke behov for typecasting.
Overvej nedenstående kode:
List mylist = new ArrayList(); mylist.add('Java'); String mystr = (String) list.get(0); //typecasting required
Som du kan se, når der bruges en normal liste, skal du indtaste listeelementet til den passende type, som det gøres for mystr ovenfor.
Lad os nu skrive den samme kode igen med en generisk liste.
List list = new ArrayList(); list.add('Java'); String mystr = list.get(0);
Her har vi specificeret strengtypen som et generisk udtryk for listedeklarationen. For at hente individuelle elementer på denne liste behøver vi således ikke at skrive.
# 4) Implementere generiske algoritmer
Du kan implementere mange flere generiske algoritmer, når du bruger Generics til at kode.
# 5) Kompileringstidskontrol
Som allerede nævnt, når du bruger Generics i dit Java-program, kontrollerer kompilatoren typerne på kompileringstidspunktet, hvilket forhindrer unormal opsigelse af programmet ved kørsel.
Ofte stillede spørgsmål
Q # 1) Hvorfor bruger vi Generics i Java?
Svar: Generics sikrer typeuafhængighed, dvs. vi kan levere en typeparameter, mens vi definerer en klasse / interface / metode osv., Så vi under den aktuelle instantiering kan specificere den aktuelle type. På denne måde giver vi også kode genanvendelighed.
Q # 2) Er generiske vigtige i Java?
Svar: Ja. Generisk er faktisk de vigtigste funktioner i Java for at sikre typesikkerhed, dvs. kompileringstidstypekontrol.
Spørgsmål nr. 3) Hvornår tilføjede Java Generics?
Svar: Generics blev tilføjet til Java i 2004 med J2SE 5.0 med den hensigt at sikre kompileringstidsikkerhed i Java.
Q # 4) Hvad er en generisk type?
Svar: En generisk type er en generisk klasse, grænseflade eller metode, der er forsynet med en typeparameter. Dette muliggør typesikkerhed og genbrug af koder.
Q # 5) Kan vi bruge Generics med Array i Java?
Svar: Nej. Java tillader ikke generiske arrays.
Konklusion
Dette afslutter selvstudiet om Java-generik, der betragtes som en af de vigtigste funktioner i nyere Java-versioner. Brug af Generics i Java-programmer sikrer typesikkerhed samt genbrug af kode. Det sikrer også kontrol af kompileringstid, så programmet ikke går i stykker ved kørsel.
Java-generik er meste praktisk med Java-samlingsgrænsefladen, som vi vil diskutere detaljeret i en anden tutorial i denne serie.
God læselyst!!
Anbefalet læsning
- 15 Bedste JAVA-værktøjer til udvikling, opbygning, profilering, kodedækning og gennemgang
- Java Collections Framework (JCF) vejledning
- Java datatyper, sløjfer, arrays, switch og påstande
- Java-implementering: Oprettelse og udførelse af Java JAR-fil
- Java-undtagelser og undtagelseshåndtering med eksempler
- JAVA-vejledning til begyndere: 100+ praktiske Java-videovejledninger
- Java Reflection Tutorial med eksempler
- Java 'dette' Nøgleord: Vejledning med kodeeksempler