The Java Generics Programmēšana ir ieviesta J2SE 5, lai strādātu ar tipa drošiem objektiem. Tas padara kodu stabilu, atklājot kļūdas kompilēšanas laikā.
unix vs Windows
Pirms vispārīgiem kolekcijā mēs varam glabāt jebkura veida objektus, t.i., ne vispārīgus. Tagad vispārīgie līdzekļi liek Java programmētājam saglabāt noteikta veida objektus.
Java Generics priekšrocības
Ģenēriskajiem medikamentiem galvenokārt ir 3 priekšrocības. Tie ir šādi:
1) tipa drošība: Mēs varam saturēt tikai viena veida objektus vispārīgajos produktos. Tas neļauj uzglabāt citus objektus.
Bez Generics mēs varam uzglabāt jebkura veida objektus.
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) Tipa liešana nav nepieciešama: Nav nepieciešams drukāt objektu.
Pirms Generics mums jāievada 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) Kompilēšanas laika pārbaude: Tas tiek pārbaudīts kompilēšanas laikā, tāpēc izpildes laikā problēma neradīsies. Labā programmēšanas stratēģija saka, ka problēmu ir daudz labāk risināt kompilēšanas laikā, nevis izpildlaikā.
List list = new ArrayList(); list.add('hello'); list.add(32);//Compile Time Error
Sintakse izmantot vispārīgo kolekciju
ClassOrInterface
Piemērs lai Java lietotu Generics
ArrayList
Pilns Java ģenērikas piemērs
Šeit mēs izmantojam klasi ArrayList, taču jūs varat izmantot jebkuru kolekcijas klasi, piemēram, ArrayList, LinkedList, HashSet, TreeSet, HashMap, Comparator utt.
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()); } } }Izmēģiniet to tūlīt
Izvade:
element is: jai rahul jai
Java Generics piemērs, izmantojot karti
Tagad mēs izmantosim kartes elementus, izmantojot sugas. Šeit mums ir jānodod atslēga un vērtība. Ļaujiet mums to saprast ar vienkāršu piemēru:
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>Izmēģiniet to tūlīt
Izvade
1 vijay 2 ankit 4 umesh
Vispārējā klase
Klase, kas var atsaukties uz jebkuru veidu, ir pazīstama kā vispārīga klase. Šeit mēs izmantojam T tipa parametru, lai izveidotu noteikta veida vispārīgo klasi.
Apskatīsim vienkāršu piemēru vispārīgās klases izveidei un lietošanai.
Vispārējas klases izveide:
class MyGen{ T obj; void add(T obj){this.obj=obj;} T get(){return obj;} }
T tips norāda, ka tas var attiekties uz jebkuru veidu (piemēram, virkne, vesels skaitlis un darbinieks). Klasei norādītais veids tiks izmantots datu glabāšanai un izgūšanai.
tehnoloģiju priekšrocības un trūkumi
Izmantojot vispārīgo klasi:
Apskatīsim kodu, lai izmantotu vispārīgo klasi.
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()); }}Izmēģiniet to tūlīt
Izvade
2
Tipa parametri
Tipa parametru nosaukšanas konvencijas ir svarīgas, lai rūpīgi apgūtu vispārīgos vārdus. Parastie tipa parametri ir šādi:
10 no 60
- T - Tips
- E - elements
- K - atslēga
- N — numurs
- V - Vērtība
Vispārējā metode
Tāpat kā vispārējā klase, mēs varam izveidot vispārīgu metodi, kas var pieņemt jebkāda veida argumentus. Šeit argumentu apjoms ir ierobežots ar metodi, kurā tas ir deklarēts. Tas pieļauj gan statiskas, gan nestatiskas metodes.
Apskatīsim vienkāršu Java vispārīgās metodes piemēru masīva elementu drukāšanai. Mēs izmantojam šeit UN lai apzīmētu elementu.
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 ); } }Izmēģiniet to tūlīt
Izvade
Printing Integer Array 10 20 30 40 50 Printing Character Array J A V A T P O I N T
Aizstājējzīme programmā Java Generics
? (jautājuma zīme) simbols apzīmē aizstājējzīmes elementu. Tas nozīmē jebkuru veidu. Ja mēs rakstām , tas nozīmē jebkuru skaitļa atvasināto klasi, piemēram, Integer, Float un double. Tagad mēs varam izsaukt skaitļu klases metodi, izmantojot jebkuru bērnu klases objektu.
Mēs varam izmantot aizstājējzīmi kā a parametra tips, lauks, atgriešanas veids vai lokālais mainīgais. Tomēr nav atļauts izmantot aizstājējzīmi kā tipa argumentu vispārīgas metodes izsaukšanai, vispārīgas klases instances izveidei vai supertipam. .
Sapratīsim to, izmantojot tālāk sniegto piemēru:
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); }}
Izvade
drawing rectangle drawing circle drawing circle
Augšējās robežas aizstājējzīmes
Augšējo ierobežoto aizstājējzīmju mērķis ir samazināt ierobežojumus mainīgajam. Tas ierobežo nezināmo tipu kā noteiktu veidu vai šī tipa apakštipu. To izmanto, deklarējot aizstājējzīmi ('?'), kam seko atslēgvārds paplašinājums (klases gadījumā) vai implements (interfeisa gadījumā), kam seko tā augšējā robeža.
Sintakse
List
Šeit,
? ir aizstājējzīme.
pagarina , ir atslēgvārds.
Numurs , ir klase java.lang pakotnē
Pieņemsim, ka mēs vēlamies uzrakstīt metodi skaitļu un tā apakštipu sarakstam (piemēram, Integer, Double). Izmantojot Saraksts ir piemērots numura tipa sarakstam vai kādai no tā apakšklasēm, turpretim Saraksts darbojas tikai ar numuru tipa sarakstu. Tātad, Saraksts ir mazāk ierobežojošs nekā Saraksts .
Augšējās robežas aizstājējzīmes piemērs
Šajā piemērā mēs izmantojam augšējās robežas aizstājējzīmes, lai rakstītu metodi sarakstam un sarakstam.
10 ml līdz oz
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)); } }Izmēģiniet to tūlīt
Izvade
displaying the sum= 30.0 displaying the sum= 70.0
Neierobežoti aizstājējzīmes
Neierobežotais aizstājējzīmes veids ir nezināma veida saraksts, piemēram, saraksts. Šī pieeja var būt noderīga šādos gadījumos: -
- Kad dotā metode tiek realizēta, izmantojot Object klasē paredzēto funkcionalitāti.
- Ja vispārīgajā klasē ir metodes, kas nav atkarīgas no tipa parametra.
Neierobežoto aizstājējzīmju piemērs
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); } }Izmēģiniet to tūlīt
Izvade
displaying the Integer values 1 2 3 displaying the String values One Two Three
Aizstājējzīmes ar apakšējo robežu
Apakšējās robežas aizstājējzīmju mērķis ir ierobežot nezināmo tipu, lai tas būtu noteikts tips vai šī tipa supertips. To izmanto, deklarējot aizstājējzīmi ('?'), kam seko super atslēgvārds, kam seko tā apakšējā robeža.
Sintakse
List
Šeit,
? ir aizstājējzīme.
super , ir atslēgvārds.
Vesels skaitlis , ir iesaiņojuma klase.
statisks atslēgvārds java
Pieņemsim, ka mēs vēlamies uzrakstīt metodi veselā skaitļa sarakstam un tā supertipam (piemēram, numurs, objekts). Izmantojot Saraksts ir piemērots veselu skaitļu sarakstam vai jebkurai no tā virsklasēm, turpretim Saraksts darbojas tikai ar Integer tipa sarakstu. Tātad, Saraksts ir mazāk ierobežojošs nekā Saraksts .
Apakšējās robežas aizstājējzīmes piemērs
Šajā piemērā mēs izmantojam apakšējās robežas aizstājējzīmes, lai rakstītu metodi sarakstam un sarakstam.
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); } }Izmēģiniet to tūlīt
Izvade
displaying the Integer values 1 2 3 displaying the Number values 1.0 2.0 3.0