java generics tutorial with examples
जावा जेनेरिक एक प्रकार की विशेषताएँ हैं जो आपको डेटा प्रकार से स्वतंत्र कोड लिखने की अनुमति देती हैं। यह आलेख जावा जेनरिक को विस्तार से बताता है:
सेल फोन पर जासूसी करने के लिए क्षुधा
जेनरिक जावा की महत्वपूर्ण विशेषताओं में से एक है और इसे जावा 5 से शुरू किया गया था।
परिभाषा के अनुसार, जेनरिक जावा भाषा सुविधाओं का एक समूह है जो प्रोग्रामर को जेनेरिक प्रकारों और कार्यों का उपयोग करने की अनुमति देता है और इस प्रकार प्रकार की सुरक्षा सुनिश्चित करता है।
आप क्या सीखेंगे:
जावा में जेनरिक कैसे काम करते हैं?
यदि आपने पहले C ++ के साथ काम किया है, तो Java Generics C ++ में टेम्पलेट के समान है। जावा जेनरिक आपको अपनी कक्षा / पद्धति की परिभाषा में एक पैरामीटर शामिल करने की अनुमति देता है जिसमें एक आदिम डेटा प्रकार का मूल्य होगा।
उदाहरण के लिए, आपके पास एक सामान्य वर्ग 'एरे' हो सकता है:
क्लास ऐरे {…}
कहां है पैरामीटराइज्ड टाइप।
इसके बाद, आप निम्नानुसार इस वर्ग के लिए ऑब्जेक्ट बना सकते हैं:
Array int_array = new Array () Array char_array = new Array ();
तो जेनेरिक पैरामीटराइज्ड क्लास को देखते हुए, आप एक ही क्लास के ऑब्जेक्ट्स को अलग-अलग डेटा प्रकारों के पैरामीटर के रूप में बना सकते हैं। यह जावा जेनरिक का उपयोग करने का मुख्य सार है।
इसी तरह, आप किसी सरणी को छांटने के लिए एक पैरामीटर प्रकार के साथ एक सामान्य विधि लिख सकते हैं और फिर इस विधि को किसी भी आदिम प्रकार से त्वरित कर सकते हैं।
जावा जेनरिक का उपयोग ज्यादातर जावा के संग्रह ढांचे के साथ किया जाता है। LinkedList, List, Map, HashMap, आदि जैसे विभिन्न संग्रह कार्यान्वयन के लिए जेनरिक का उपयोग करते हैं। जेनरिक टाइप-सेफ्टी प्रदान करते हैं क्योंकि कंपाइलिंग के समय टाइपिंग की जाती है, जिससे आपका कोड अधिक स्टेबल हो जाता है।
आइए अब हम जेनेरिक कक्षाओं और विधियों के विवरण के साथ-साथ अन्य संबंधित विषयों पर अधिक जानकारी देते हैं।
सामान्य वर्ग
एक सामान्य वर्ग एक सामान्य वर्ग के समान है सिवाय इसके कि वर्गनाम को कोणीय कोष्ठक में एक प्रकार के बाद है।
सामान्य श्रेणी की एक सामान्य परिभाषा इस प्रकार है:
वर्ग class_name
{{
वर्ग चर;
… ..
कक्षा के तरीके;
}
एक बार कक्षा परिभाषित हो जाने के बाद, आप किसी भी प्रकार के डेटा प्रकार की वस्तुएँ बना सकते हैं, जिन्हें आप निम्न प्रकार से चाहते हैं:
class_name obj = new class_name ();
उदाहरण के लिए, पूर्णांक वस्तु के लिए घोषणा होगी:
class_name obj = new class_name;
इसी प्रकार, स्ट्रिंग डेटा प्रकार के लिए, ऑब्जेक्ट होगा:
class_name str_Obj = new class_name;
जेनेरिक वर्ग के लिए एक उदाहरण कार्यान्वयन नीचे दिखाया गया है।
class MyGenericClass { T obj; void add(T obj) { this.obj=obj; } T get() { return obj; } } class Main { public static void main(String args()) { MyGenericClass m_int=new MyGenericClass(); m_int.add(2); MyGenericClassmstr=new MyGenericClass(); mstr.add('SoftwaretestingHelp'); System.out.println('Member of MyGenericClass:' + m_int.get()); System.out.println('Member of MyGenericClass:' + mstr.get()); } }
आउटपुट:
उपरोक्त कार्यक्रम में, एक वर्ग MyGenericClass एक सामान्य वर्ग है। इसकी दो विधियाँ हैं अर्थात् जोड़ और प्राप्त करें। विधि जोड़ने से जेनेरिक ऑब्जेक्ट को इनिशियलाइज़ किया जाता है, जबकि मेथड ऑब्जेक्ट लौटाता है।
मुख्य फ़ंक्शन में, हम प्रत्येक के दो ऑब्जेक्ट्स को इंटेगर और स्ट्रिंग प्रकार घोषित करते हैं। हम इन दोनों वस्तुओं को उनके संबंधित प्रारंभिक मानों के साथ जोड़कर विधि का उपयोग करते हैं और फिर प्राप्त विधि का उपयोग करके इन वस्तुओं की सामग्री का उत्पादन करते हैं।
हमने जेनेरिक श्रेणी का उदाहरण एक प्रकार के पैरामीटर के साथ प्रस्तुत किया है। लेकिन वास्तव में, एक वर्ग में एक से अधिक प्रकार के पैरामीटर हो सकते हैं। इस स्थिति में, प्रकार पैरामीटर को अल्पविराम द्वारा अलग किया जाता है।
निम्न उदाहरण यह प्रदर्शित करता है:
classTest_Generics { T1 obj1; // An object of type T1 T2 obj2; // An object of type T2 // constructor to initialise T1 & T2 objects Test_Generics(T1 obj1, T2 obj2) { this.obj1 = obj1; this.obj2 = obj2; } public void print() { System.out.println('T1 Object:' + obj1); System.out.println('T2 Object:' + obj2); } } class Main { public static void main (String() args) { Test_Genericsobj = newTest_Generics('Java Generics', 1); obj.print(); } }
आउटपुट:
इस कार्यक्रम में, हमारे पास दो प्रकार के पैरामीटर हैं अर्थात् टी 1 और टी 2। हमारे पास सदस्य वस्तुओं को इनिशियलाइज़ करने और सामग्री को प्रिंट करने के लिए कार्य हैं। मुख्य कार्य में, हम दो प्रकारों के साथ एक वस्तु की घोषणा करते हैं अर्थात् स्ट्रिंग और इंटेगर। कार्यक्रम का आउटपुट निर्मित ऑब्जेक्ट की सामग्री को दर्शाता है।
कक्षाओं की तरह, आप जेनेरिक इंटरफेस भी कर सकते हैं। हम एक अलग विषय में सभी इंटरफेस के बारे में जानेंगे।
जावा सामान्य तरीके
जिस तरह आपके पास जेनेरिक क्लासेस और इंटरफेस हो सकते हैं, वैसे ही जेनेरिक तरीके भी हो सकते हैं, अगर आपको जेनेरिक होने के लिए पूरी क्लास की जरूरत नहीं है।
निम्न कार्यक्रम जेनेरिक विधि 'प्रिंटगैरनिकएयर्रे' के कार्यान्वयन को दर्शाता है। मुख्य फ़ंक्शन में विधि कॉल पर ध्यान दें। यहां हम जेनेरिक विधि से दो कॉल करते हैं, पहली बार टाइप के साथ और फिर टाइप के साथ।
public class Main{ public static void printGenericArray(T() items) { for ( T item : items){ System.out.print(item + ' '); } System.out.println(); } public static void main( String args() ) { Integer() int_Array = { 1, 3, 5, 7, 9, 11 }; Character() char_Array = { 'J', 'A', 'V', 'A', 'T','U','T','O','R','I','A', 'L','S' }; System.out.println( 'Integer Array contents:' ); printGenericArray(int_Array ); System.out.println( 'Character Array contents:' ); printGenericArray(char_Array ); } }
आउटपुट:
बाउंडेड टाइप पैरामीटर्स
जब आप जेनरिक में डेटा प्रकारों को सीमित करना चाहते हैं, तो बंधे हुए टाइप पैरामीटर चित्र में आते हैं। उदाहरण के लिए, यदि आप चाहते हैं कि एक विशेष सामान्य वर्ग या विधि या कोई भी इंटरफ़ेस जो केवल संख्यात्मक डेटा प्रकारों के लिए काम करे, तो आप यह निर्दिष्ट कर सकते हैं कि 'फैली' कीवर्ड का उपयोग कर।
यह नीचे दिखाया गया है:
List myList = new ArrayList(); List list1 = new ArrayList();
उपरोक्त दो घोषणाओं को कंपाइलर द्वारा स्वीकार किया जाएगा क्योंकि लॉन्ग और इंटेगर नंबर के उपवर्ग हैं।
अगली घोषणा, हालांकि, एक समस्या होने जा रही है।
List list = new ArrayList();
यह एक संकलित समय त्रुटि देगा क्योंकि स्ट्रिंग एक संख्या नहीं है। उपरोक्त उदाहरण में प्रतीक as? 'को वाइल्डकार्ड के रूप में जाना जाता है और हम इसके बारे में आगे चर्चा करेंगे।
तो सामान्य तौर पर, बंधे हुए प्रकार के मापदंडों का उपयोग ज्यादातर तब किया जाता है जब आप अपने जेनरिक कोड में उपयोग किए जाने वाले डेटा प्रकारों को प्रतिबंधित करना चाहते हैं।
जावा जेनरिक वाइल्डकार्ड
जावा में, एक वाइल्डकार्ड को एक प्रश्न चिह्न, ’?’ से दर्शाया जाता है जिसका उपयोग किसी अज्ञात प्रकार को संदर्भित करने के लिए किया जाता है। वाइल्डकार्ड का उपयोग ज्यादातर जेनरिक के साथ एक पैरामीटर प्रकार के रूप में किया जाता है।
जेनेरिक वाइल्डकार्ड का उपयोग करते समय, आपको एक बिंदु याद रखना चाहिए कि यद्यपि ऑब्जेक्ट अन्य सभी वर्गों का सुपरक्लास है, वस्तुओं का संग्रह ( उदाहरण के लिए, सूची) अन्य सभी संग्रहों का सुपरक्लास नहीं है।
कैसे नकली ईमेल खाते बनाने के लिए
पैरामीटर प्रकार के रूप में उपयोग किए जाने के अलावा, आप एक वाइल्डकार्ड को एक फ़ील्ड, एक स्थानीय चर और जैसे के रूप में उपयोग कर सकते हैं। हालाँकि, आप कभी भी वाइल्डकार्ड का उपयोग सुपरस्क्रिप्ट के रूप में, या जेनेरिक विधि को लागू करने के लिए या जेनेरिक क्लास के इंस्टेंस के निर्माण के मामले में एक प्रकार के तर्क के रूप में नहीं कर सकते हैं।
वाइल्डकार्ड पैरामीटर प्रकार के कई उदाहरण हैं (यहाँ कम से कम एक प्रकार का तर्क वाइल्डकार्ड है) जैसा कि नीचे दिखाया गया है और विभिन्न स्थानों पर उपयोग किए जाने वाले वाइल्डकार्ड की अलग-अलग व्याख्या की जाएगी:
- संग्रह <: संग्रह उपयोग किए गए प्रकार के तर्क के बावजूद सभी संग्रह इंटरफ़ेस तात्कालिकता को दर्शाता है।
- सूची extends Number< : सूची सभी प्रकार की सूची का प्रतिनिधित्व करती है जहां तत्व प्रकार एक संख्या होगी।
- तुलनित्र: सभी तुलनित्र इंटरफ़ेस प्रकार के तर्क के लिए तात्कालिकता जो कि स्ट्रिंग्सअपर्टिप्स हैं।
ध्यान दें कि एक वाइल्डकार्ड पैरामीटराइज्ड प्रकार एक नियम है जो मान्य प्रकारों को पहचानने के लिए लगाया जाता है। यह एक ठोस डेटा प्रकार नहीं है। जेनेरिक वाइल्डकार्ड बंधे या अनबाउंड हो सकते हैं।
(1) अनबाउंड वाइल्डकार्ड
अनबाउंडेड वाइल्डकार्ड में, प्रकार चर पर कोई प्रतिबंध नहीं है और इसे निम्नानुसार दर्शाया गया है:
ArrayList mylist = new ArrayList(); ArrayList my_strList = new ArrayList();
# 2) वाइल्डकार्ड से बंधे
हम पहले से ही बंधे हुए प्रकारों पर चर्चा कर चुके हैं। ये उन डेटा प्रकारों पर प्रतिबंध लगाते हैं जो कीवर्ड का उपयोग करते हुए प्रकार के मापदंडों को त्वरित करने के लिए उपयोग किए जाते हैं - विस्तारित या सुपर। इन वाइल्डकार्ड को अपर बाउंडेड वाइल्डकार्ड और लोअर बाउंडेड वाइल्डकार्ड में विभाजित किया जा सकता है।
- अपर बाउंडेड वाइल्डकार्ड्स
यदि आप चाहते हैं कि आपकी सामान्य अभिव्यक्ति किसी दिए गए प्रकार के सभी उपवर्गों के लिए मान्य हो, तो आप कीवर्ड के साथ ऊपरी सीमाबद्ध वाइल्डकार्ड का विस्तार करते हैं।
उदाहरण के लिए, मान लें कि आपको एक सामान्य विधि की आवश्यकता है जो सूची, सूची आदि का समर्थन करती है, तो आप एक ऊपरी बाउंडेड वाइल्डकार्ड जैसे निर्दिष्ट कर सकते हैं सूची । जैसा कि संख्या एक सुपरक्लास है, यह जेनेरिक विधि अपने सभी उपवर्गों के लिए काम करेगी।
निम्नलिखित कार्यक्रम यह प्रदर्शित करता है।
importjava.util.*; public class Main { private static Number summation (List numbers){ double sum = 0.0; for (Number n : numbers) sum += n.doubleValue(); return sum; } public static void main(String() args) { //Number subtype : Integer Listint_list = Arrays.asList(1,3,5,7,9); System.out.println('Sum of the elements in int_list:' + summation(int_list)); //Number subtype : Double List doubles_list = Arrays.asList(1.0,1.5,2.0,2.5,3.0,3.5); System.out.println('Sum of the elements in doubles_list:' + summation(doubles_list)); } }
आउटपुट:
यहां हमने फ़ंक्शन 'सारांश' के प्रकार तर्क पर एक ऊपरी बाध्य वाइल्डकार्ड, सूची प्रदान की है। मुख्य कार्य में, हम दो सूचियों को परिभाषित करते हैं अर्थात् प्रकार का पूर्णांक int_list और टाइप डबल का युगल_सूची। जैसा कि इंटेगर और डबल नंबर के उपवर्ग हैं, इन दोनों सूचियों पर फ़ंक्शन समन पूरी तरह से काम करता है।
- लोअर बाउंडेड वाइल्डकार्ड्स
यदि आप चाहते हैं कि सामान्य अभिव्यक्ति किसी विशेष प्रकार के सभी सुपरक्लेसेस को स्वीकार करे तो आप अपने टाइप के तर्क के लिए लोअर बाउंडेड वाइल्डकार्ड निर्दिष्ट कर सकते हैं।
इसके लिए एक उदाहरण कार्यान्वयन नीचे दिया गया है:
importjava.util.*; class Main { public static void main(String() args) { //Integer List ListInt_list= Arrays.asList(1,3,5,7); System.out.print('Integer List:'); printforLowerBoundedWildcards(Int_list); //Number list ListNumber_list= Arrays.asList(2,4,6,8); System.out.print('Number List:'); printforLowerBoundedWildcards(Number_list); } public static void printforLowerBoundedWildcards(List list) { System.out.println(list); } }
आउटपुट:
इस कार्यक्रम में, निर्दिष्ट बाउंडेड वाइल्डकार्ड 'सूची' है। फिर मुख्य फ़ंक्शन में, हमारे पास एक प्रकार की सूची और सूची है। जैसा कि हमने लोअर बाउंडेड वाइल्डकार्ड का इस्तेमाल किया है, संख्या वर्ग एक सुपरक्लास ऑफ इंटेगर एक मान्य प्रकार का तर्क है।
जावा पीढ़ी के लाभ
(1) टाइप सेफ्टी
जेनरिक टाइप सेफ्टी सुनिश्चित करते हैं। इसका मतलब है कि टाइप चेकिंग रन टाइम के बजाय कंपाइल टाइम पर की जाती है। इस प्रकार रनटाइम के दौरान 'क्लासकैस्टैक्सेप्शन' होने की कोई संभावना नहीं है क्योंकि सही प्रकार का उपयोग किया जाएगा।
importjava.util.*; class Main { public static void main(String() args) { List mylist = new ArrayList(); mylist.add(10); mylist.add('10'); System.out.println(mylist); List list = new ArrayList(); list.add(10); list.add('10');// compile-time error System.out.println(list); } }
उपरोक्त कार्यक्रम में, हमारी दो सूचियाँ हैं, एक बिना जेनरिक की और दूसरी जेनरिक की। गैर-सामान्य सूची में, कोई प्रकार सुरक्षा नहीं है। आप एक पूर्णांक, स्ट्रिंग, आदि को एक तत्व के रूप में जोड़ सकते हैं और इसे स्वीकार किया जाता है।
जेनेरिक सूची में, आप केवल एक प्रकार का तत्व जोड़ सकते हैं जो जेनेरिक अभिव्यक्ति में निर्दिष्ट है। यदि आप किसी अन्य प्रकार के एक तत्व को जोड़ने का प्रयास करते हैं, तो यह एक संकलन-समय त्रुटि के परिणामस्वरूप होता है।
उपर्युक्त कार्यक्रम में संकलन-समय त्रुटि को लाइन में फ्लैश किया गया है:
list.add('10');
# 2) कोड पुन: प्रयोज्य
जेनरिक का उपयोग करते हुए, आपको प्रत्येक डेटा प्रकार के लिए अलग कोड लिखने की आवश्यकता नहीं है। आप एक एकल वर्ग या विधि आदि लिख सकते हैं और इसका उपयोग सभी डेटा प्रकारों के लिए कर सकते हैं।
# 3) टाइपकास्टिंग के लिए कोई ज़रूरत नहीं है
जैसा कि आप जेनरिक का उपयोग कर रहे हैं, कंपाइलर उपयोग किए जाने वाले प्रकारों के बारे में जानता है, फिर टाइपकास्टिंग की कोई आवश्यकता नहीं है।
नीचे दिए गए कोड पर विचार करें:
List mylist = new ArrayList(); mylist.add('Java'); String mystr = (String) list.get(0); //typecasting required
जैसा कि आप देख सकते हैं कि जब एक सामान्य सूची का उपयोग किया जाता है तो आपको सूची तत्व को उसके उपयुक्त प्रकार पर टाइप करने की आवश्यकता होती है जिस तरह से यह ऊपर के रहस्य के लिए किया जाता है।
अब हम जेनेरिक सूची के साथ फिर से उसी कोड को लिखते हैं।
List list = new ArrayList(); list.add('Java'); String mystr = list.get(0);
यहां, हमने सूची घोषणा के लिए एक सामान्य अभिव्यक्ति के रूप में स्ट्रिंग प्रकार निर्दिष्ट किया है। इस प्रकार, इस सूची के व्यक्तिगत तत्वों को पुनः प्राप्त करने के लिए, हमें टाइपकास्ट की आवश्यकता नहीं है।
# 4) जेनेरिक एल्गोरिदम लागू करें
जब आप कोड का उपयोग करते हैं तो आप बहुत अधिक जेनेरिक एल्गोरिदम लागू कर सकते हैं।
# 5) संकलन-समय की जाँच
जैसा कि पहले ही उल्लेख किया गया है, जब आप अपने जावा प्रोग्राम में जेनेरिक का उपयोग करते हैं, तो कंपाइलर संकलन समय पर प्रकारों की जांच करता है और इस प्रकार रनटाइम पर प्रोग्राम की असामान्य समाप्ति को रोकता है।
बार बार पूछे जाने वाले प्रश्न
क्यू # 1) हम जावा में जेनेरिक का उपयोग क्यों करते हैं?
उत्तर: जेनेरिक प्रकार की स्वतंत्रता सुनिश्चित करते हैं यानी हम एक वर्ग / इंटरफ़ेस / विधि आदि को परिभाषित करते हुए एक प्रकार का पैरामीटर प्रदान कर सकते हैं ताकि वास्तविक तात्कालिकता के दौरान हम वास्तविक प्रकार को निर्दिष्ट कर सकें। इस तरह हम कोड पुन: प्रयोज्य भी प्रदान करते हैं।
Q # 2) क्या जावा में जेनेरिक महत्वपूर्ण हैं?
उत्तर: हाँ। वास्तव में, जेनेरिक प्रकार की सुरक्षा यानी कम्पाइल-टाइम टाइप जाँच सुनिश्चित करने के लिए जावा की सबसे महत्वपूर्ण विशेषताएं हैं।
Q # 3) जावा ने जेनरिक को कब जोड़ा?
उत्तर: 2004 में जावा में कंपाइल-टाइम टाइप सुरक्षा सुनिश्चित करने के इरादे से J2SE 5.0 के साथ जेनरिक को जावा में जोड़ा गया था।
Q # 4) जेनेरिक प्रकार क्या है?
उत्तर: एक जेनेरिक प्रकार एक जेनेरिक क्लास, इंटरफ़ेस या विधि है जो एक प्रकार के पैरामीटर के साथ प्रदान की जाती है। यह प्रकार की सुरक्षा और कोड के पुन: उपयोग के लिए अनुमति देता है।
Q # 5) क्या हम जावा में ऐरे के साथ जेनरिक का उपयोग कर सकते हैं?
उत्तर: नहीं, जावा सामान्य सरणियों की अनुमति नहीं देता है।
Android बाजार के लिए मुफ्त संगीत डाउनलोडर
निष्कर्ष
यह जावा जेनरिक पर ट्यूटोरियल को समाप्त करता है जिसे हाल के जावा संस्करणों में सबसे महत्वपूर्ण विशेषताओं में से एक माना जाता है। जावा प्रोग्राम में जेनरिक का उपयोग करने से टाइप सुरक्षा के साथ-साथ कोड का पुन: उपयोग सुनिश्चित होता है। यह संकलन-समय की जाँच भी सुनिश्चित करता है ताकि प्रोग्राम रनटाइम पर न टूटे।
जावा जेनेरिक ज्यादातर जावा संग्रह इंटरफ़ेस के साथ काम में आते हैं जो हम इस श्रृंखला में एक और ट्यूटोरियल में विस्तार से चर्चा करेंगे।
पढ़ने का आनंद लो!!
अनुशंसित पाठ
- विकास, निर्माण, प्रोफाइलर, कोड कवरेज और समीक्षा के लिए 15 सर्वश्रेष्ठ जावा उपकरण
- जावा कलेक्शंस फ्रेमवर्क (JCF) ट्यूटोरियल
- जावा डेटाटेप्स, लूप्स, एरेस, स्विच एंड एसेसरीज
- जावा परिनियोजन: जावा जार फ़ाइल का निर्माण और निष्पादन
- उदाहरणों के साथ जावा अपवाद और अपवाद हैंडलिंग
- जावा ट्यूटोरियल फॉर बिगिनर्स: 100+ हैंड्स-ऑन जावा वीडियो ट्यूटोरियल
- उदाहरणों के साथ जावा परावर्तन ट्यूटोरियल
- जावा 'यह' कीवर्ड: कोड उदाहरणों के साथ ट्यूटोरियल