logo

Generisk i Java

Det Java Generics programmering er introduceret i J2SE 5 for at håndtere typesikre objekter. Det gør koden stabil ved at opdage fejlene på kompileringstidspunktet.

'murerens formel'

Før generiske stoffer kan vi opbevare enhver type objekter i samlingen, dvs. ikke-generiske. Nu tvinger generika java-programmøren til at gemme en bestemt type objekter.

Fordelen ved Java Generics

Der er hovedsageligt 3 fordele ved generiske lægemidler. De er som følger:

1) Typesikkerhed: Vi kan kun have en enkelt type objekter i generiske. Det tillader ikke at opbevare andre genstande.

Uden Generics kan vi opbevare enhver type objekter.

 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) Typestøbning er ikke påkrævet: Der er ingen grund til at typecaste objektet.

Før Generics skal vi skrive cast.

 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) Kontrol af kompileringstid: Det kontrolleres på kompileringstidspunktet, så problemet vil ikke opstå under kørsel. Den gode programmeringsstrategi siger, at det er langt bedre at håndtere problemet på kompileringstidspunktet end runtime.

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

Syntaks at bruge generisk samling

 ClassOrInterface 

Eksempel at bruge Generics i java

 ArrayList 

Fuldstændig eksempel på Generics i Java

Her bruger vi ArrayList-klassen, men du kan bruge enhver samlingsklasse som ArrayList, LinkedList, HashSet, TreeSet, HashMap, Comparator osv.

 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 det nu

Produktion:

 element is: jai rahul jai 

Eksempel på Java Generics ved hjælp af Map

Nu skal vi bruge kortelementer ved hjælp af generiske. Her skal vi videregive nøgle og værdi. Lad os forstå det med et simpelt eksempel:

 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 det nu

Produktion

navnekonvention java
 1 vijay 2 ankit 4 umesh 

Generisk klasse

En klasse, der kan henvise til enhver type, er kendt som en generisk klasse. Her bruger vi T-type-parameteren til at skabe den generiske klasse af specifik type.

Lad os se et simpelt eksempel på at oprette og bruge den generiske klasse.

Oprettelse af en generisk klasse:

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

T-typen angiver, at den kan henvise til enhver type (såsom streng, heltal og medarbejder). Den type, du angiver for klassen, vil blive brugt til at gemme og hente dataene.

Brug af generisk klasse:

Lad os se koden for at bruge den generiske klasse.

 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 det nu

Produktion

 2 

Type parametre

Typeparametrenes navngivningskonventioner er vigtige for at lære generiske stoffer grundigt. De almindelige typeparametre er som følger:

er lig med streng i java
  1. T - Type
  2. E - Element
  3. K - Nøgle
  4. N - Antal
  5. V - Værdi

Generisk metode

Ligesom den generiske klasse kan vi skabe en generisk metode, der kan acceptere enhver type argumenter. Her er rækkevidden af ​​argumenter begrænset til den metode, hvor den er deklareret. Det tillader statiske såvel som ikke-statiske metoder.

Lad os se et simpelt eksempel på en generisk java-metode til at udskrive array-elementer. Vi bruger her OG for at betegne elementet.

 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 det nu

Produktion

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

Wildcard i Java Generics

Det ? (spørgsmålstegn) symbol repræsenterer jokertegnelementet. Det betyder enhver type. Hvis vi skriver , betyder det en hvilken som helst underordnet klasse af Number, f.eks. Integer, Float og double. Nu kan vi kalde metoden for nummerklasse gennem et hvilket som helst underordnet klasseobjekt.

Vi kan bruge et jokertegn som et type af en parameter, et felt, en returtype eller en lokal variabel. Det er dog ikke tilladt at bruge et jokertegn som et typeargument for en generisk metodekaldelse, en generisk klasseforekomstoprettelse eller en supertype .

Lad os forstå det med eksemplet nedenfor:

 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); }} 

Produktion

 drawing rectangle drawing circle drawing circle 

Jokertegn med øvre grænse

Formålet med jokertegn med øvre grænse er at mindske restriktionerne for en variabel. Det begrænser den ukendte type til at være en specifik type eller en undertype af den type. Det bruges ved at erklære jokertegn ('?') efterfulgt af udvides (i tilfælde af, klasse) eller implementerer (i tilfælde af, grænseflade) nøgleordet, efterfulgt af dets øvre grænse.

Syntaks

 List 

Her,

? er et jokertegn.

strækker sig , er et nøgleord.

Nummer , er en klasse til stede i java.lang-pakken

Antag, at vi vil skrive metoden til listen over tal og dets undertyper (såsom heltal, dobbelt). Ved brug af Liste er velegnet til en liste over typenummer eller en hvilken som helst af dens underklasser, hvorimod Liste fungerer kun med listen over typenummer. Så, Liste er mindre restriktiv end Liste .

numrene i alfabetet

Eksempel på Upper Bound Wildcard

I dette eksempel bruger vi de øvre grænse jokertegn til at skrive metoden for List og List.

 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 det nu

Produktion

 displaying the sum= 30.0 displaying the sum= 70.0 

Ubegrænsede jokertegn

Den ubundne jokertegnstype repræsenterer listen over en ukendt type såsom List. Denne tilgang kan være nyttig i følgende scenarier: -

  • Når den givne metode er implementeret ved at bruge funktionaliteten i Object-klassen.
  • Når den generiske klasse indeholder de metoder, der ikke afhænger af typeparameteren.

Eksempel på ubundne jokertegn

 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 det nu

Produktion

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

Lavere afgrænsede jokertegn

Formålet med lavere afgrænsede jokertegn er at begrænse den ukendte type til at være en specifik type eller en supertype af den type. Det bruges ved at angive jokertegn ('?') efterfulgt af supernøgleordet efterfulgt af dets nedre grænse.

Syntaks

 List 

Her,

? er et jokertegn.

super , er et nøgleord.

Heltal , er en indpakningsklasse.

linux tastaturgenveje

Antag, at vi vil skrive metoden til listen over heltal og dets supertype (som tal, objekt). Ved brug af Liste er velegnet til en liste af typen Heltal eller en hvilken som helst af dens superklasser, hvorimod Liste virker kun med listen af ​​typen heltal. Så, Liste er mindre restriktiv end Liste .

Eksempel på Lower Bound Wildcard

I dette eksempel bruger vi jokertegn med lavere grænse til at skrive metoden for List og List.

 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 det nu

Produktion

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