logo

Generic în Java

The Generic Java programarea este introdusă în J2SE 5 pentru a se ocupa de obiecte de tip sigur. Face codul stabil prin detectarea erorilor în timpul compilării.

Powershell comentariu multilinie

Înainte de generice, putem stoca orice tip de obiecte din colecție, adică negenerice. Acum genericele forțează programatorul java să stocheze un anumit tip de obiecte.

Avantajul Java Generics

Există în principal 3 avantaje ale genericelor. Acestea sunt după cum urmează:

1) Tip de siguranță: Putem deține doar un singur tip de obiecte în generice. Nu permite stocarea altor obiecte.

Fără generice, putem stoca orice tip de obiecte.

 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) Nu este necesară turnarea de tip: Nu este nevoie să tipați obiectul.

Înainte de Generics, trebuie să introducem 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) Verificare la timp de compilare: Este verificat în timpul compilării, astfel încât problema nu va apărea în timpul execuției. Strategia bună de programare spune că este mult mai bine să gestionezi problema în timpul compilării decât în ​​timpul executării.

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

Sintaxă pentru a utiliza colecția generică

 ClassOrInterface 

Exemplu pentru a utiliza generice în java

 ArrayList 

Exemplu complet de generice în Java

Aici, folosim clasa ArrayList, dar puteți folosi orice clasă de colecție, cum ar fi ArrayList, LinkedList, HashSet, TreeSet, HashMap, Comparator etc.

 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()); } } } 
Testează-l acum

Ieșire:

 element is: jai rahul jai 

Exemplu de generice Java folosind Map

Acum vom folosi elemente de hartă folosind generice. Aici, trebuie să transmitem cheia și valoarea. Să-l înțelegem printr-un exemplu simplu:

 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>
Testează-l acum

Ieșire

 1 vijay 2 ankit 4 umesh 

Clasa generica

O clasă care se poate referi la orice tip este cunoscută ca o clasă generică. Aici, folosim parametrul de tip T pentru a crea clasa generică de tip specific.

Să vedem un exemplu simplu pentru a crea și utiliza clasa generică.

Crearea unei clase generice:

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

Tipul T indică faptul că se poate referi la orice tip (cum ar fi String, Integer și Employee). Tipul pe care îl specificați pentru clasă va fi folosit pentru a stoca și a prelua datele.

varsta salman khan khan

Folosind clasa generică:

Să vedem codul pentru a utiliza clasa generică.

 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()); }} 
Testează-l acum

Ieșire

 2 

Parametri de tip

Convențiile de denumire a parametrilor de tip sunt importante pentru a învăța temeinic genericele. Parametrii de tip comun sunt următorii:

100 km/h în mph
  1. T - Tip
  2. E - Element
  3. K - Cheie
  4. N - Număr
  5. V - Valoare

Metoda generică

Ca și clasa generică, putem crea o metodă generică care poate accepta orice tip de argumente. Aici, sfera argumentelor este limitată la metoda în care este declarată. Permite metode statice și non-statice.

Să vedem un exemplu simplu de metodă generică java pentru a imprima elemente de matrice. Noi folosim aici ȘI pentru a desemna elementul.

 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 ); } } 
Testează-l acum

Ieșire

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

Wildcard în Java Generics

Cel ? simbolul (semnul de întrebare) reprezintă elementul wildcard. Înseamnă orice tip. Dacă scriem , înseamnă orice clasă copil de Number, de exemplu, Integer, Float și double. Acum putem apela metoda clasei Number prin orice obiect de clasă copil.

Putem folosi un wildcard ca a tipul unui parametru, câmp, tip de returnare sau variabilă locală. Cu toate acestea, nu este permisă utilizarea unui wildcard ca argument de tip pentru o invocare a unei metode generice, crearea unei instanțe de clasă generică sau un supertip .

Să-l înțelegem prin exemplul de mai jos:

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

Ieșire

 drawing rectangle drawing circle drawing circle 

Caractere jokere delimitate superioare

Scopul wildcard-urilor mărginite de sus este de a reduce restricțiile asupra unei variabile. Limitează tipul necunoscut să fie un tip specific sau un subtip de acel tip. Este folosit prin declararea caracterului wildcard ('?') urmat de cuvântul cheie extins (în cazul clasei) sau implementează (în cazul interfeței), urmat de limita sa superioară.

java sort arraylist

Sintaxă

 List 

Aici,

? este un caracter wildcard.

se extinde , este un cuvânt cheie.

Număr , este o clasă prezentă în pachetul java.lang

Să presupunem că vrem să scriem metoda pentru lista de Număr și subtipurile sale (cum ar fi Integer, Double). Folosind Listă este potrivit pentru o listă de tip Număr sau oricare dintre subclasele sale, întrucât Listă funcționează numai cu lista de tip Număr. Asa de, Listă este mai puțin restrictivă decât Listă .

Exemplu de wildcard cu limită superioară

În acest exemplu, folosim caracterele metalice superioare pentru a scrie metoda pentru 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)); } } 
Testează-l acum

Ieșire

 displaying the sum= 30.0 displaying the sum= 70.0 

Wildcards nelimitate

Tipul wildcard nelimitat reprezintă lista unui tip necunoscut, cum ar fi Listă. Această abordare poate fi utilă în următoarele scenarii: -

  • Când metoda dată este implementată prin utilizarea funcționalității furnizate în clasa Object.
  • Când clasa generică conține metode care nu depind de parametrul tip.

Exemplu de wildcards nelimitate

 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); } } 
Testează-l acum

Ieșire

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

Wildcards cu mărginire inferioară

Scopul wildcard-urilor mărginite inferioară este de a restricționa tipul necunoscut să fie un tip specific sau un supertip de acel tip. Este folosit prin declararea caracterului joker ('?') urmat de cuvântul cheie super, urmat de limita sa inferioară.

Sintaxă

 List 

Aici,

? este un caracter wildcard.

super , este un cuvânt cheie.

Întreg , este o clasă de ambalare.

linie nouă python

Să presupunem că vrem să scriem metoda pentru lista de Integer și supertipul său (cum ar fi Număr, Obiect). Folosind Listă este potrivit pentru o listă de tip Integer sau oricare dintre superclasele sale, întrucât Listă funcționează numai cu lista de tip Integer. Asa de, Listă este mai puțin restrictivă decât Listă .

Exemplu de wildcard cu limită inferioară

În acest exemplu, folosim caracterele joker cu limita inferioară pentru a scrie metoda pentru 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); } } 
Testează-l acum

Ieșire

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