logo

Generiki v Javi

The Java Generics programiranje je uvedeno v J2SE 5 za obravnavanje tipsko varnih objektov. Naredi kodo stabilno z odkrivanjem napak med prevajanjem.

anonimna funkcija java

Pred generičnimi lahko v zbirko shranimo katero koli vrsto objektov, torej negenerične. Zdaj generiki prisilijo programerja Java, da shrani določeno vrsto objektov.

Prednost Java Generics

Generiki imajo predvsem 3 prednosti. So naslednji:

1) Tipska varnost: V generiki lahko hranimo samo eno vrsto objektov. Ne dovoljuje shranjevanja drugih predmetov.

Brez Generics lahko shranimo katero koli vrsto objektov.

 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) Tipsko ulivanje ni potrebno: Objekta ni treba tipizirati.

Pred Generics moramo vnesti 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) Preverjanje med prevajanjem: Preverjen je v času prevajanja, tako da se težava ne bo pojavila med izvajanjem. Dobra strategija programiranja pravi, da je veliko bolje rešiti problem v času prevajanja kot med izvajanjem.

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

Sintaksa za uporabo generične zbirke

 ClassOrInterface 

Primer za uporabo Generics v Javi

 ArrayList 

Celoten primer generičnega v Javi

Tukaj uporabljamo razred ArrayList, vendar lahko uporabite kateri koli razred zbirke, kot je ArrayList, LinkedList, HashSet, TreeSet, HashMap, Comparator itd.

java filter tok
 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()); } } } 
Preizkusite zdaj

Izhod:

 element is: jai rahul jai 

Primer Java Generics z uporabo Map

Zdaj bomo uporabili elemente zemljevida z uporabo generičnih. Tukaj moramo posredovati ključ in vrednost. Naj to razumemo s preprostim primerom:

 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>
Preizkusite zdaj

Izhod

 1 vijay 2 ankit 4 umesh 

Generični razred

Razred, ki se lahko nanaša na katero koli vrsto, je znan kot generični razred. Tukaj uporabljamo parameter tipa T za ustvarjanje generičnega razreda določenega tipa.

Oglejmo si preprost primer ustvarjanja in uporabe generičnega razreda.

Ustvarjanje generičnega razreda:

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

Tip T označuje, da se lahko nanaša na kateri koli tip (na primer String, Integer in Employee). Tip, ki ga določite za razred, bo uporabljen za shranjevanje in pridobivanje podatkov.

Uporaba generičnega razreda:

Oglejmo si kodo za uporabo generičnega razreda.

 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()); }} 
Preizkusite zdaj

Izhod

 2 

Parametri vrste

Dogovori o poimenovanju parametrov tipa so pomembni za temeljito učenje generičnih. Skupni parametri vrste so naslednji:

10 od 60
  1. T - Vrsta
  2. E - Element
  3. K - ključ
  4. N - Število
  5. V - Vrednost

Generična metoda

Tako kot generični razred lahko ustvarimo generično metodo, ki lahko sprejme katero koli vrsto argumentov. Tukaj je obseg argumentov omejen na metodo, kjer je deklariran. Omogoča statične in tudi nestatične metode.

Oglejmo si preprost primer generične metode Java za tiskanje elementov polja. Tukaj uporabljamo IN za označevanje elementa.

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

Izhod

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

Nadomestni znak v Java Generics

? (vprašaj) simbol predstavlja element nadomestnega znaka. Pomeni katero koli vrsto. Če napišemo , to pomeni kateri koli podrejeni razred števila, npr. Integer, Float in double. Zdaj lahko pokličemo metodo razreda Number prek katerega koli predmeta podrejenega razreda.

Kot a tip parametra, polja, povratnega tipa ali lokalne spremenljivke. Vendar ni dovoljeno uporabljati nadomestnega znaka kot argumenta tipa za priklic generične metode, ustvarjanje generičnega primerka razreda ali nadtip .

Razumejmo to na spodnjem primeru:

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

Izhod

 drawing rectangle drawing circle drawing circle 

Zgornje meje nadomestnih znakov

Namen zgoraj omejenih nadomestnih znakov je zmanjšati omejitve za spremenljivko. Neznan tip omejuje na določen tip ali podtip tega tipa. Uporablja se tako, da se deklarira nadomestni znak ('?'), ki mu sledi ključna beseda extends (v primeru razreda) ali implements (v primeru vmesnika), ki ji sledi zgornja meja.

Sintaksa

 List 

tukaj,

format niza java

? je nadomestni znak.

se razteza , je ključna beseda.

številka , je razred, ki je prisoten v paketu java.lang

Recimo, da želimo napisati metodo za seznam Number in njegovih podtipov (kot je Integer, Double). Uporaba Seznam je primeren za seznam tipa Number ali katerega koli od njegovih podrazredov, medtem ko je Seznam deluje samo s seznamom vrste Število. Torej, Seznam je manj restriktiven kot Seznam .

Primer nadomestnega znaka zgornje meje

V tem primeru uporabljamo nadomestne znake zgornje meje za pisanje metode za List in 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)); } } 
Preizkusite zdaj

Izhod

 displaying the sum= 30.0 displaying the sum= 70.0 

Neomejeni nadomestni znaki

Vrsta neomejenega nadomestnega znaka predstavlja seznam neznane vrste, kot je List. Ta pristop je lahko uporaben v naslednjih scenarijih: -

  • Ko je dana metoda implementirana z uporabo funkcionalnosti, ki je na voljo v razredu Object.
  • Ko generični razred vsebuje metode, ki niso odvisne od parametra tipa.

Primer neomejenih nadomestnih znakov

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

Izhod

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

Spodaj omejeni nadomestni znaki

Namen nadomestnih znakov z nižjo mejo je omejiti neznani tip na določen tip ali nadtip tega tipa. Uporablja se tako, da se deklarira nadomestni znak ('?'), ki mu sledi ključna beseda super, ki ji sledi spodnja meja.

Sintaksa

 List 

tukaj,

? je nadomestni znak.

super , je ključna beseda.

Celo število , je ovojni razred.

Neena Gupta

Recimo, da želimo napisati metodo za seznam Integer in njegovega supertipa (kot je Number, Object). Uporaba Seznam je primeren za seznam tipa Integer ali katerega koli od njegovih nadrazredov, medtem ko je Seznam deluje samo s seznamom tipa Integer. Torej, Seznam je manj restriktiven kot Seznam .

Primer nadomestnega znaka spodnje meje

V tem primeru uporabljamo nadomestne znake spodnje meje za pisanje metode za List in 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); } } 
Preizkusite zdaj

Izhod

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