logo

Generici u Javi

The Java Generici programiranje je uvedeno u J2SE 5 za rad s objektima sigurnim za tip. Čini kod stabilnim otkrivanjem grešaka tijekom kompajliranja.

mojlivecricket.in

Prije generičkih, u zbirci možemo pohraniti bilo koju vrstu objekata, tj. negeneričke. Sada generici prisiljavaju java programera da pohranjuje određenu vrstu objekata.

Prednost Java Generics

Uglavnom postoje 3 prednosti generičkih lijekova. Oni su sljedeći:

1) Sigurnost tipa: Možemo držati samo jednu vrstu objekata u generičkom obliku. Ne dopušta pohranjivanje drugih objekata.

Bez Generics možemo pohraniti bilo koju vrstu objekata.

 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 lijevanje nije potrebno: Nema potrebe za tipiziranjem objekta.

Prije Generics, moramo upisati 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) Provjera vremena kompajliranja: Provjerava se u vrijeme kompajliranja tako da se problem neće pojaviti tijekom izvođenja. Dobra programska strategija kaže da je daleko bolje rješavati problem u vrijeme kompajliranja nego u vrijeme izvođenja.

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

Sintaksa koristiti generičku zbirku

 ClassOrInterface 

Primjer koristiti generičko u Javi

 ArrayList 

Puni primjer generičkog u Javi

Ovdje koristimo klasu ArrayList, ali možete koristiti bilo koju klasu zbirke kao što su ArrayList, LinkedList, HashSet, TreeSet, HashMap, Comparator itd.

 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()); } } } 
Testirajte sada

Izlaz:

 element is: jai rahul jai 

Primjer Java Generics koristeći Map

Sada ćemo upotrijebiti elemente mape koristeći generike. Ovdje moramo proslijediti ključ i vrijednost. Shvatimo to na jednostavnom primjeru:

 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>
Testirajte sada

Izlaz

 1 vijay 2 ankit 4 umesh 

Generička klasa

Klasa koja se može odnositi na bilo koji tip poznata je kao generička klasa. Ovdje koristimo parametar tipa T za stvaranje generičke klase određenog tipa.

Pogledajmo jednostavan primjer za stvaranje i korištenje generičke klase.

Stvaranje generičke klase:

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

Tip T označava da se može odnositi na bilo koji tip (kao što su String, Integer i Employee). Tip koji navedete za klasu koristit će se za pohranjivanje i dohvaćanje podataka.

kada završava q1

Korištenje generičke klase:

Pogledajmo kod za korištenje generičke klase.

 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()); }} 
Testirajte sada

Izlaz

 2 

Parametri tipa

Konvencije imenovanja parametara tipa važne su za temeljito učenje generičkih oblika. Uobičajeni parametri tipa su sljedeći:

najbolji hentai
  1. T - Vrsta
  2. E - Element
  3. K - ključ
  4. N - Broj
  5. V - Vrijednost

Generička metoda

Poput generičke klase, možemo stvoriti generičku metodu koja može prihvatiti bilo koju vrstu argumenata. Ovdje je opseg argumenata ograničen na metodu u kojoj je deklariran. Omogućuje statičke kao i nestatičke metode.

Pogledajmo jednostavan primjer java generičke metode za ispis elemenata niza. Ovdje koristimo I za označavanje 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 ); } } 
Testirajte sada

Izlaz

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

Zamjenski znak u Java Generici

The ? (upitnik) simbol predstavlja zamjenski element. To znači bilo koju vrstu. Ako napišemo , to znači bilo koju podređenu klasu broja, npr. Integer, Float i double. Sada možemo pozvati metodu klase Number kroz bilo koji objekt klase djeteta.

Zamjenski znak možemo koristiti kao tip parametra, polje, povratni tip ili lokalna varijabla. Međutim, nije dopušteno koristiti zamjenski znak kao argument tipa za pozivanje generičke metode, stvaranje generičke instance klase ili supertip .

Shvatimo to na primjeru u nastavku:

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

Izlaz

 drawing rectangle drawing circle drawing circle 

Gornje granice zamjenskih znakova

Svrha gornje granice zamjenskih znakova je smanjiti ograničenja na varijablu. Ograničava nepoznati tip da bude određeni tip ili podtip tog tipa. Koristi se deklariranjem zamjenskog znaka ('?') iza kojeg slijedi ključna riječ extends (u slučaju klase) ili implements (u slučaju sučelja), nakon čega slijedi njegova gornja granica.

Sintaksa

 List 

Ovdje,

? je zamjenski znak.

proteže se , ključna je riječ.

arraylist java

Broj , je klasa prisutna u java.lang paketu

Pretpostavimo da želimo napisati metodu za popis broja i njegovih podtipova (kao što su Integer, Double). Korištenje Popis prikladan je za popis tipa Number ili bilo koju njegovu podklasu, dok je Popis radi samo s popisom tipa Broj. Tako, Popis je manje restriktivan od Popis .

Primjer zamjenskog znaka gornje granice

U ovom primjeru koristimo zamjenske znakove gornje granice za pisanje metode za List i 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)); } } 
Testirajte sada

Izlaz

 displaying the sum= 30.0 displaying the sum= 70.0 

Neograničeni zamjenski znakovi

Neograničeni tip zamjenskog znaka predstavlja popis nepoznatog tipa kao što je List. Ovaj pristup može biti koristan u sljedećim scenarijima: -

  • Kada se navedena metoda implementira korištenjem funkcionalnosti u klasi Object.
  • Kada generička klasa sadrži metode koje ne ovise o parametru tipa.

Primjer neograničenih zamjenskih znakova

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

Izlaz

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

Zamjenski znakovi donje granice

Svrha zamjenskih znakova donje granice je ograničiti nepoznati tip da bude određeni tip ili supertip tog tipa. Koristi se deklariranjem zamjenskog znaka ('?') iza kojeg slijedi ključna riječ super, nakon koje slijedi donja granica.

Sintaksa

 List 

Ovdje,

? je zamjenski znak.

super , ključna je riječ.

Cijeli broj , je klasa omotača.

vol protiv bika

Pretpostavimo da želimo napisati metodu za popis Integera i njegovog supertipa (kao što je broj, objekt). Korištenje Popis prikladan je za popis tipa Integer ili bilo koju od njegovih nadklasa, dok je Popis radi samo s popisom tipa Integer. Tako, Popis je manje restriktivan od Popis .

Primjer zamjenskog znaka donje granice

U ovom primjeru koristimo zamjenske znakove donje granice za pisanje metode za List i 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); } } 
Testirajte sada

Izlaz

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