java generics tutorial with examples
Java Generics er et sett med funksjoner som lar deg skrive kode uavhengig av datatypen. Denne artikkelen forklarer Java Generics i detalj med eksempler:
Generikk er en av de viktigste funksjonene i Java og ble introdusert fra Java 5 og utover.
Per definisjon er Generics et sett med Java-språkfunksjoner som lar programmereren bruke generiske typer og funksjoner og dermed sikre typesikkerhet.
Hva du vil lære:
Hvordan fungerer generiske stoffer i Java?
Hvis du har jobbet med C ++ før, er Java Generics det samme som maler i C ++. Java Generics lar deg inkludere en parameter i klassen / metodedefinisjonen som vil ha verdien av en primitiv datatype.
For eksempel, du kan ha en generisk klasse 'Array' som følger:
Klassearray {….}
Hvor er den parametriserte typen.
Deretter kan du lage objekter for denne klassen som følger:
Array int_array = new Array () Array char_array = new Array ();
Så gitt en generisk parameterisert klasse, kan du opprette objekter av samme klasse med forskjellige datatyper som parametere. Dette er hoved essensen av å bruke Java Generics.
På samme måte kan du skrive en generisk metode med en parameterisert type for å sortere en matrise, og deretter instantiere denne metoden til en hvilken som helst primitiv type.
Java Generics brukes hovedsakelig med Java-samlerammen. De forskjellige samlingene som LinkedList, List, Map, HashMap, etc. bruker Generics for implementering. Generics gir typesikkerhet ettersom typekontrollen gjøres på kompileringstidspunktet, og dermed blir koden din mer stabil.
La oss nå mer om detaljene i generiske klasser og metoder samt andre relaterte emner.
Generiske klasser
En generisk klasse er den samme som en normal klasse, bortsett fra at klassenavnet blir etterfulgt av en type i vinkelparenteser.
En generell definisjon av en generisk klasse er som følger:
klasse klasse_navn
{
klassevariabler;
… ..
klassemetoder;
}
Når klassen er definert, kan du opprette objekter av hvilken datatype du vil ha som følger:
class_name obj = new class_name ();
For eksempel, For Integer-objektet vil erklæringen være:
class_name obj = new class_name;
På samme måte vil objektet være for String-datatypen:
class_name str_Obj = new class_name;
Et eksempel på implementering for generisk klasse 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()); } }
Produksjon:
I programmet ovenfor er en klasse MyGenericClass en generisk klasse. Den har to metoder, dvs. legge til og få. Metoden add initialiserer det generiske objektet mens get-metodene returnerer objektet.
I hovedfunksjonen erklærer vi to objekter av Heltall og Stringtype hver. Vi initialiserer begge disse objektene med deres respektive opprinnelige verdier ved hjelp av add-metoden, og sender deretter innholdet av disse objektene ved hjelp av get-metoden.
Vi presenterte generisk klasseeksempel ovenfor med en type parameter. Men i virkeligheten kan en klasse også ha mer enn én type parameter. I dette tilfellet er typeparametrene atskilt med 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(); } }
Produksjon:
I dette programmet har vi to typeparametere, dvs. T1 og T2. Vi har funksjoner for å initialisere medlemsobjektene og også for å skrive ut innholdet. I hovedfunksjonen erklærer vi et objekt med to typer, dvs. streng og heltal. Programmets utgang viser innholdet til det opprettede objektet.
Akkurat som klasser, kan du også ha generiske grensesnitt. Vi vil lære alt om grensesnitt i et eget emne.
Java generiske metoder
Akkurat som du kan ha generiske klasser og grensesnitt, kan du også ha generiske metoder i tilfelle du ikke trenger en hel klasse for å være generisk.
Følgende program viser implementeringen av den generiske metoden “printGenericArray”. Legg merke til metodeanropet i hovedfunksjonen. Her foretar vi to anrop til den generiske metoden, første gang med type og deretter 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 ); } }
Produksjon:
apper for å spionere på mobiltelefoner
Begrensede type parametere
Parametere for begrenset type kommer inn i bildet når du vil begrense datatypene i Generics. For eksempel, Hvis du vil at en bestemt generisk klasse eller metode eller et hvilket som helst grensesnitt som bare skal fungere for numeriske datatyper, kan du angi at du bruker søkeordet 'utvider'.
Dette vises nedenfor:
List myList = new ArrayList(); List list1 = new ArrayList();
Ovennevnte to erklæringer vil bli akseptert av kompilatoren da Long og Integer er underklasser av Number.
Den neste erklæringen vil imidlertid være et problem.
List list = new ArrayList();
Dette vil gi en kompileringstidsfeil fordi streng ikke er et tall. Symbolet ‘?’ I eksemplet ovenfor er kjent som et jokertegn, og vi vil diskutere det neste.
Generelt sett blir parametere med avgrenset type mest brukt når du vil begrense datatypene som skal brukes i generikkoden din.
Java Generics jokertegn
I Java betegnes et jokertegn med et spørsmålstegn, ‘?’ Som brukes til å referere til en ukjent type. Jokertegn brukes for det meste med generiske stoffer som parametertype.
Når du bruker generiske jokertegn, må du huske ett poeng at selv om objektet er superklassen til alle andre klasser, er samlingen av objekter ( For eksempel, List) er ikke en superklasse av alle andre samlinger.
Bortsett fra å bli brukt som en parametertype, kan du bruke et jokertegn som et felt, en lokal variabel og som sådan. Du kan imidlertid aldri bruke et jokertegn som en supertype, eller som et typeargument for å påkalle generisk metode eller i tilfelle oppretting av en forekomst av en generisk klasse.
kommandoen i unix med eksempler
Det er mange eksempler på parametriserte typer med jokertegn (her er minst ett typeargument et jokertegn) som vist nedenfor, og jokertegnene som brukes forskjellige steder vil bli tolket annerledes:
- Samling <: Samling betegner all instantiering for samlingsgrensesnitt, uavhengig av typen argument som brukes.
- Liste extends Number< : Liste representerer alle listetyper der elementtypen vil være et tall.
- Komparator: Alle instantiatorer for komparatorgrensesnitt for typeargumenter som er Stringsupertypes.
Merk at en jokertegnparameterert type er en regel som pålegges for å gjenkjenne gyldige typer. Det er ikke en konkret datatype. Generiske jokertegn kan være avgrenset eller ubegrenset.
# 1) Ubegrensede jokertegn
I ubegrensede jokertegn er det ingen begrensninger for typevariabler og er betegnet som følger:
ArrayList mylist = new ArrayList(); ArrayList my_strList = new ArrayList();
# 2) Avgrensede jokertegn
Vi har allerede diskutert avgrensede typer. Disse setter begrensningene på datatypen som brukes til å instantiere typeparametrene ved hjelp av nøkkelordene - utvider eller super. Disse jokertegnene kan deles videre i øvre avgrensede jokertegn og nedre avgrensede jokertegn.
- Øvre avgrensede jokertegn
Hvis du vil at det generiske uttrykket ditt skal være gyldig for alle underklasser av en gitt type, spesifiserer du det øvre avgrensede jokertegnet med nøkkelordet utvides.
For eksempel, antar at du trenger en generisk metode som støtter liste, liste osv., så kan du spesifisere et øvre avgrenset jokertegn som Liste . Siden Number er en superklasse, vil denne generiske metoden fungere for alle underklassene.
Følgende program demonstrerer dette.
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)); } }
Produksjon:
Her har vi gitt et øvre grense jokertegn, liste opp til typeargumentet for funksjonen 'summering'. I hovedfunksjonen definerer vi to lister, dvs. int_list av typen Integer og double_list av typen Double. Ettersom Integer og Double er underklassene til Number, fungerer funksjonssammendraget perfekt på begge disse listene.
- Wildcards med lavere grenser
Hvis du vil at det generiske uttrykket skal akseptere alle superklassene av en bestemt type, kan du angi et lavere begrenset jokertegn for typeargumentet.
Et eksempel på implementering av dette er gitt 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); } }
Produksjon:
I dette programmet er det spesifiserte nedre grensen 'List'. Så i hovedfunksjonen har vi en typeliste og listen. Ettersom vi har brukt Wildcard med lavere begrensning, er Number-klassen en superklasse av Integer er et gyldig typeargument.
Fordeler med Java Generics
# 1) Type sikkerhet
Generiske stoffer garanterer typesikkerhet. Dette betyr at typekontroll utføres på kompileringstidspunkt i stedet for på kjøretid. Dermed er det ingen sjanse for å få “ClassCastException” i løpet av kjøretiden, da riktige typer vil bli brukt.
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 programmet ovenfor har vi to lister, en uten generiske og en annen med generiske. I den ikke-generiske listen er det ingen typesikkerhet. Du kan legge til et heltall, streng osv. Som et element, og det aksepteres.
I den generiske listen kan du bare legge til en type element som er spesifisert i det generiske uttrykket. Hvis du prøver å legge til et element av en annen type, resulterer det i en kompilasjonsfeil.
I programmet ovenfor blinker kompileringstidsfeilen på linjen:
list.add('10');
# 2) Gjenbrukbarhet
Ved å bruke Generics trenger du ikke skrive egen kode for hver datatype. Du kan skrive en enkelt klasse eller metode osv. Og bruke den til alle datatyper.
# 3) Ingen behov for typeprognoser
Når du bruker Generics, vet kompilatoren om typene som er brukt, da er det ikke behov for typecasting.
Vurder koden nedenfor:
List mylist = new ArrayList(); mylist.add('Java'); String mystr = (String) list.get(0); //typecasting required
Som du kan se når en vanlig liste brukes, må du skrive frem elementelisten til riktig type slik den gjøres for mystr ovenfor.
La oss nå skrive den samme koden igjen med en generell liste.
List list = new ArrayList(); list.add('Java'); String mystr = list.get(0);
Her har vi spesifisert strengtypen som et generisk uttrykk for listedeklarasjonen. For å hente individuelle elementer i denne listen trenger vi ikke å skrive ut.
# 4) Implementere generiske algoritmer
Du kan implementere mange flere generiske algoritmer når du bruker Generics til å kode.
# 5) Kontroll av kompileringstid
Som allerede nevnt, når du bruker Generics i Java-programmet ditt, sjekker kompilatoren typene på kompileringstidspunktet, og forhindrer derfor unormal avslutning av programmet ved kjøretid.
ofte stilte spørsmål
Q # 1) Hvorfor bruker vi Generics i Java?
Svar: Generics sørger for typeuavhengighet, det vil si at vi kan gi en typeparameter mens vi definerer en klasse / grensesnitt / metode etc. slik at vi under den faktiske instantieringen kan spesifisere den faktiske typen. På denne måten gir vi også kode gjenbrukbar.
Q # 2) Er generiske viktige i Java?
Svar: Ja. Generisk er faktisk de viktigste funksjonene i Java for å sikre typesikkerhet, dvs. kompileringstidstypekontroll.
Sp # 3) Når la Java til Generics?
Svar: Generics ble lagt til Java i 2004 med J2SE 5.0 med den hensikt å sikre kompileringstidsikkerhet i Java.
Q # 4) Hva er en generisk type?
Svar: En generisk type er en generisk klasse, grensesnitt eller metode som er utstyrt med en typeparameter. Dette muliggjør typesikkerhet og gjenbruk av kode.
Q # 5) Kan vi bruke Generics med Array i Java?
Svar: Nei. Java tillater ikke generiske matriser.
Konklusjon
Dette avslutter opplæringen om Java-generikk som regnes som en av de viktigste funksjonene i nyere Java-versjoner. Bruk av Generics i Java-programmer sørger for typesikkerhet samt kodebruk. Det sørger også for kontroll av kompileringstid slik at programmet ikke går i stykker ved kjøretid.
Java-generikk kommer til nytte hovedsakelig med Java-samlingsgrensesnitt som vi vil diskutere i detalj i en annen opplæring i denne serien.
Glad lesning !!
Anbefalt lesing
- 15 beste JAVA-verktøy for utvikling, bygging, profilering, kodedekning og gjennomgang
- Java Collections Framework (JCF) Tutorial
- Java datatyper, sløyfer, matriser, bryter og påstander
- Java-distribusjon: Opprettelse og utføring av Java JAR-fil
- Java-unntak og unntakshåndtering med eksempler
- JAVA-opplæring for nybegynnere: 100+ praktiske Java-videoveiledninger
- Java Reflection Tutorial med eksempler
- Java 'dette' nøkkelord: Opplæring med kodeeksempler