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,'vijay'); map.put(4,'umesh'); map.put(2,'ankit'); //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()+' '+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('vivek');//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
- T - Tip
- E - Element
- K - Cheie
- N - Număr
- 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 = { 'J', 'A', 'V', 'A', 'T','P','O','I','N','T' }; System.out.println( 'Printing Integer Array' ); printArray( intArray ); System.out.println( 'Printing Character Array' ); 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('drawing rectangle');} } class Circle extends Shape{ void draw(){System.out.println('drawing circle');} } 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('displaying the sum= '+add(l1)); ArrayList l2=new ArrayList(); l2.add(30.0); l2.add(40.0); System.out.println('displaying the sum= '+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('displaying the Integer values'); display(l1); List l2=Arrays.asList('One','Two','Three'); System.out.println('displaying the String values'); 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('displaying the Integer values'); addNumbers(l1); List l2=Arrays.asList(1.0,2.0,3.0); System.out.println('displaying the Number values'); addNumbers(l2); } }Testează-l acum
Ieșire
displaying the Integer values 1 2 3 displaying the Number values 1.0 2.0 3.0