logo

Generieken op Java

De Java-generieken programmeren wordt geïntroduceerd in J2SE 5 om met typeveilige objecten om te gaan. Het maakt de code stabiel door de bugs tijdens het compileren te detecteren.

shellscript uitvoerbaar maken

Vóór generieke objecten kunnen we elk type object in de collectie opslaan, dat wil zeggen niet-generiek. Nu dwingen generieke geneesmiddelen de Java-programmeur om een ​​specifiek type objecten op te slaan.

Voordeel van Java-generieken

Er zijn hoofdzakelijk 3 voordelen van generieke geneesmiddelen. Ze zijn als volgt:

1) Typeveiligheid: We kunnen slechts één type objecten in generieke gegevens bevatten. Het is niet mogelijk om andere objecten op te slaan.

Zonder generieken kunnen we elk type object opslaan.

 List list = new ArrayList(); list.add(10); list.add('10'); With Generics, it is required to specify the type of object we need to store. List list = new ArrayList(); list.add(10); list.add('10');// compile-time error 

2) Typegieten is niet vereist: Het is niet nodig om het object te typeren.

Vóór Generics moeten we cast typen.

 List list = new ArrayList(); list.add('hello'); String s = (String) list.get(0);//typecasting After Generics, we don't need to typecast the object. List list = new ArrayList(); list.add('hello'); String s = list.get(0); 

3) Controle tijdens het compileren: Het wordt tijdens het compileren gecontroleerd, zodat er zich tijdens runtime geen problemen voordoen. De goede programmeerstrategie zegt dat het veel beter is om het probleem tijdens het compileren op te lossen dan tijdens de runtime.

 List list = new ArrayList(); list.add('hello'); list.add(32);//Compile Time Error 

Syntaxis generieke verzameling gebruiken

 ClassOrInterface 

Voorbeeld om Generieken in Java te gebruiken

 ArrayList 

Volledig voorbeeld van generieke geneesmiddelen in Java

Hier gebruiken we de klasse ArrayList, maar u kunt elke verzamelklasse gebruiken, zoals ArrayList, LinkedList, HashSet, TreeSet, HashMap, Comparator enz.

 import java.util.*; class TestGenerics1{ public static void main(String args[]){ ArrayList list=new ArrayList(); list.add('rahul'); list.add('jai'); //list.add(32);//compile time error String s=list.get(1);//type casting is not required System.out.println('element is: '+s); Iterator itr=list.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } } 

 import java.util.*; class TestGenerics1{ public static void main(String args[]){ ArrayList list=new ArrayList(); list.add('rahul'); list.add('jai'); //list.add(32);//compile time error String s=list.get(1);//type casting is not required System.out.println('element is: '+s); Iterator itr=list.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } } 
Test het nu

Uitgang:

 element is: jai rahul jai 

Voorbeeld van Java-generieken met behulp van Map

Nu gaan we kaartelementen gebruiken met behulp van generieke middelen. Hier moeten we sleutel en waarde doorgeven. Laten we het begrijpen aan de hand van een eenvoudig voorbeeld:

 import java.util.*; class TestGenerics2{ public static void main(String args[]){ Map map=new HashMap(); map.put(1,&apos;vijay&apos;); map.put(4,&apos;umesh&apos;); map.put(2,&apos;ankit&apos;); //Now use Map.Entry for Set and Iterator Set<map.entry> set=map.entrySet(); Iterator<map.entry> itr=set.iterator(); while(itr.hasNext()){ Map.Entry e=itr.next();//no need to typecast System.out.println(e.getKey()+&apos; &apos;+e.getValue()); } }} </map.entry></map.entry>
Test het nu

Uitvoer

 1 vijay 2 ankit 4 umesh 

Generieke klasse

Een klasse die naar elk type kan verwijzen, staat bekend als een generieke klasse. Hier gebruiken we de parameter T-type om de generieke klasse van een specifiek type te maken.

Laten we een eenvoudig voorbeeld bekijken om de generieke klasse te maken en te gebruiken.

Een generieke klasse maken:

 class MyGen{ T obj; void add(T obj){this.obj=obj;} T get(){return obj;} } 

Het T-type geeft aan dat het naar elk type kan verwijzen (zoals String, Integer en Employee). Het type dat u voor de klasse opgeeft, wordt gebruikt om de gegevens op te slaan en op te halen.

Linux voer cmd uit

Generieke klasse gebruiken:

Laten we de code bekijken om de generieke klasse te gebruiken.

 class TestGenerics3{ public static void main(String args[]){ MyGen m=new MyGen(); m.add(2); //m.add(&apos;vivek&apos;);//Compile time error System.out.println(m.get()); }} 
Test het nu

Uitvoer

 2 

Typ parameters

De naamgevingsconventies voor typeparameters zijn belangrijk om generieke geneesmiddelen grondig te leren. De algemene typeparameters zijn als volgt:

java arraylist sorteren
  1. T-Type
  2. E - Element
  3. K - Sleutel
  4. N - Nummer
  5. V - Waarde

Generieke methode

Net als de generieke klasse kunnen we een generieke methode maken die elk type argumenten kan accepteren. Hier is de reikwijdte van de argumenten beperkt tot de methode waarin deze wordt gedeclareerd. Het maakt zowel statische als niet-statische methoden mogelijk.

Laten we een eenvoudig voorbeeld bekijken van een generieke Java-methode om array-elementen af ​​te drukken. Wij gebruiken hier EN om het element aan te duiden.

 public class TestGenerics4{ public static void printArray(E[] elements) { for ( E element : elements){ System.out.println(element ); } System.out.println(); } public static void main( String args[] ) { Integer[] intArray = { 10, 20, 30, 40, 50 }; Character[] charArray = { &apos;J&apos;, &apos;A&apos;, &apos;V&apos;, &apos;A&apos;, &apos;T&apos;,&apos;P&apos;,&apos;O&apos;,&apos;I&apos;,&apos;N&apos;,&apos;T&apos; }; System.out.println( &apos;Printing Integer Array&apos; ); printArray( intArray ); System.out.println( &apos;Printing Character Array&apos; ); printArray( charArray ); } } 
Test het nu

Uitvoer

 Printing Integer Array 10 20 30 40 50 Printing Character Array J A V A T P O I N T 

Wildcard in Java-generieken

De ? (vraagteken) symbool vertegenwoordigt het jokertekenelement. Het betekent elk type. Als we schrijven, betekent dit elke onderliggende klasse van Number, bijvoorbeeld Integer, Float en double. Nu kunnen we de methode van de klasse Number aanroepen via elk onderliggend klasseobject.

We kunnen een wildcard gebruiken als type van een parameter, veld, retourtype of lokale variabele. Het is echter niet toegestaan ​​om een ​​jokerteken te gebruiken als typeargument voor het aanroepen van een generieke methode, het maken van een generieke klasse-instantie of een supertype .

Laten we het begrijpen aan de hand van het onderstaande voorbeeld:

 import java.util.*; abstract class Shape{ abstract void draw(); } class Rectangle extends Shape{ void draw(){System.out.println(&apos;drawing rectangle&apos;);} } class Circle extends Shape{ void draw(){System.out.println(&apos;drawing circle&apos;);} } class GenericTest{ //creating a method that accepts only child class of Shape public static void drawShapes(List lists){ for(Shape s:lists){ s.draw();//calling method of Shape class by child class instance } } public static void main(String args[]){ List list1=new ArrayList(); list1.add(new Rectangle()); List list2=new ArrayList(); list2.add(new Circle()); list2.add(new Circle()); drawShapes(list1); drawShapes(list2); }} 

Uitvoer

 drawing rectangle drawing circle drawing circle 

Bovengrens jokertekens

Het doel van jokertekens met een bovengrens is om de beperkingen voor een variabele te verminderen. Het beperkt het onbekende type tot een specifiek type of een subtype van dat type. Het wordt gebruikt door het jokerteken ('?') te declareren, gevolgd door het trefwoord extends (in het geval van, klasse) of implementeert (in het geval van, interface), gevolgd door de bovengrens ervan.

iteratie van de kaart in Java

Syntaxis

 List 

Hier,

? is een jokerteken.

strekt zich uit , is een sleutelwoord.

Nummer , is een klasse die aanwezig is in het pakket java.lang

Stel dat we de methode willen schrijven voor de lijst met getallen en de subtypen ervan (zoals Integer, Double). Gebruik makend van Lijst is geschikt voor een lijst van het type Nummer of een van de subklassen ervan, terwijl Lijst werkt alleen met de lijst van het type Nummer. Dus, Lijst is minder beperkend dan Lijst .

Voorbeeld van een jokerteken voor de bovengrens

In dit voorbeeld gebruiken we de jokertekens voor de bovengrens om de methode voor Lijst en Lijst te schrijven.

 import java.util.ArrayList; public class UpperBoundWildcard { private static Double add(ArrayList num) { double sum=0.0; for(Number n:num) { sum = sum+n.doubleValue(); } return sum; } public static void main(String[] args) { ArrayList l1=new ArrayList(); l1.add(10); l1.add(20); System.out.println(&apos;displaying the sum= &apos;+add(l1)); ArrayList l2=new ArrayList(); l2.add(30.0); l2.add(40.0); System.out.println(&apos;displaying the sum= &apos;+add(l2)); } } 
Test het nu

Uitvoer

 displaying the sum= 30.0 displaying the sum= 70.0 

Onbegrensde jokertekens

Het onbegrensde jokertekentype vertegenwoordigt de lijst van een onbekend type, zoals Lijst. Deze aanpak kan nuttig zijn in de volgende scenario's: -

  • Wanneer de gegeven methode wordt geïmplementeerd met behulp van de functionaliteit die wordt geboden in de Object-klasse.
  • Wanneer de generieke klasse de methoden bevat die niet afhankelijk zijn van de parameter type.

Voorbeeld van onbegrensde jokertekens

 import java.util.Arrays; import java.util.List; public class UnboundedWildcard { public static void display(List list) { for(Object o:list) { System.out.println(o); } } public static void main(String[] args) { List l1=Arrays.asList(1,2,3); System.out.println(&apos;displaying the Integer values&apos;); display(l1); List l2=Arrays.asList(&apos;One&apos;,&apos;Two&apos;,&apos;Three&apos;); System.out.println(&apos;displaying the String values&apos;); display(l2); } } 
Test het nu

Uitvoer

 displaying the Integer values 1 2 3 displaying the String values One Two Three 

Ondergrens jokertekens

Het doel van jokertekens met lagere grenzen is om het onbekende type te beperken tot een specifiek type of een supertype van dat type. Het wordt gebruikt door een jokerteken ('?') te declareren, gevolgd door het super-trefwoord, gevolgd door de ondergrens ervan.

Syntaxis

 List 

Hier,

? is een jokerteken.

super , is een sleutelwoord.

Geheel getal , is een wrapper-klasse.

Java-datum naar tekenreeks

Stel dat we de methode willen schrijven voor de lijst met gehele getallen en het supertype ervan (zoals Getal, Object). Gebruik makend van Lijst is geschikt voor een lijst van het type Integer of een van zijn superklassen, terwijl Lijst werkt alleen met de lijst van het type Integer. Dus, Lijst is minder beperkend dan Lijst .

Voorbeeld van een jokerteken voor de ondergrens

In dit voorbeeld gebruiken we de jokertekens voor de ondergrens om de methode voor Lijst en Lijst te schrijven.

 import java.util.Arrays; import java.util.List; public class LowerBoundWildcard { public static void addNumbers(List list) { for(Object n:list) { System.out.println(n); } } public static void main(String[] args) { List l1=Arrays.asList(1,2,3); System.out.println(&apos;displaying the Integer values&apos;); addNumbers(l1); List l2=Arrays.asList(1.0,2.0,3.0); System.out.println(&apos;displaying the Number values&apos;); addNumbers(l2); } } 
Test het nu

Uitvoer

 displaying the Integer values 1 2 3 displaying the Number values 1.0 2.0 3.0