java generic array how simulate generic arrays java
यह ट्यूटोरियल बताता है कि ऑब्जेक्ट एरे का उपयोग करके जावा में जेनेरिक एरे की कार्यक्षमता को कैसे सरल बनाया जाए और सरल उदाहरण के लिए परावर्तन वर्ग का भी उपयोग किया जाए:
हम पहले ही चर्चा कर चुके हैं जावा जेनरिक हमारे पिछले ट्यूटोरियल में से एक। जावा सामान्य कक्षाओं, विधियों आदि की अनुमति देता है जिन्हें प्रकारों से स्वतंत्र घोषित किया जा सकता है। हालाँकि, जावा सरणी को सामान्य नहीं होने देता है।
इसका कारण यह है कि जावा में, सरणियों में उनके घटकों से संबंधित जानकारी होती है और इस जानकारी का उपयोग रनटाइम पर मेमोरी आवंटित करने के लिए किया जाता है। जब जेनेरिक का उपयोग किया जाता है, तो टाइप इरिटेशन के कारण, बाइट कोड में कोई जेनेरिक जानकारी नहीं होती है।
=> स्क्रैच से जावा जानने के लिए यहां जाएं।
आप क्या सीखेंगे:
जावा में जेनेरिक ऐरे
यदि आपने एक सामान्य सरणी को परिभाषित किया है, तो घटक प्रकार रनटाइम पर ज्ञात नहीं होगा। इस प्रकार जावा में जेनेरिक के रूप में सरणियों को परिभाषित करना उचित नहीं है।
जेनेरिक एरे की परिभाषा नीचे दी गई है:
E () newArray = new E(length);
कंपाइलर को सटीक प्रकार का पता नहीं होता है जिसे तुरंत किया जाना है क्योंकि रन टाइम पर टाइप जानकारी उपलब्ध नहीं है।
इसलिए सरणियों के बजाय, जब भी जेनेरिक की आवश्यकता होती है, आपको जावा कलेक्शंस फ्रेमवर्क के सूची घटक को प्राथमिकता देनी चाहिए। हालाँकि, आप जेनेरिक संरचनाएं बना सकते हैं जो ऑब्जेक्ट सरणी और जावा की प्रतिबिंब सुविधा का उपयोग करके सरणी की तरह हैं।
ये दो दृष्टिकोण जो हमें विभिन्न डेटा प्रकारों के सरणियों को परिभाषित करने की अनुमति देते हैं, नीचे विस्तार से बताया गया है।
क्रोम में swf फाइल नहीं खुल रही है
जेनेरिक ऐरे बनाएं और शुरू करें
इस अनुभाग में, एक सरणी जैसी संरचना बनाएं जो प्रकृति में सामान्य हो। इन संरचनाओं का उपयोग करके, आप डेटा प्रकार को एक तर्क के रूप में प्रदान करके ऐरे बना पाएंगे।
ऑब्जेक्ट एरे का उपयोग करना
यह दृष्टिकोण मुख्य सरणी वर्ग के सदस्य के रूप में टाइप ऑब्जेक्ट्स के सरणी का उपयोग करता है। हम सरणी तत्वों को पढ़ने और सेट करने के लिए प्राप्त / सेट विधियों का भी उपयोग करते हैं। फिर, हम उस मुख्य सरणी वर्ग को इंस्टेंट करते हैं जो हमें आवश्यकतानुसार डेटा प्रकार प्रदान करने की अनुमति देता है।
यह सामान्य सरणी का अनुकरण करता है।
जेनेरिक सरणी जैसी संरचना बनाने के लिए निम्न प्रोग्राम ऑब्जेक्ट एरे के उपयोग को प्रदर्शित करता है।
import java.util.Arrays; class Array { private final Object() obj_array; //object array public final int length; // class constructor public Array(int length) { // instantiate a new Object array of specified length obj_array = new Object (length); this.length = length; } // get obj_array(i) E get(int i) { @SuppressWarnings('unchecked') final E e = (E)obj_array(i); return e; } // set e at obj_array(i) void set(int i, E e) { obj_array(i) = e; } @Override public String toString() { return Arrays.toString(obj_array); } } class Main { public static void main(String() args){ final int length = 5; // creating integer array Arrayint_Array = new Array(length); System.out.print('Generic Array :' + ' '); for (int i = 0; i आउटपुट:

उपरोक्त कार्यक्रम में, हमने एक वर्ग एरे को परिभाषित किया है जो सामान्य है। ऑब्जेक्ट सरणी वर्ग का एक सदस्य है जो एक कंस्ट्रक्टर और लंबाई का उपयोग करके त्वरित किया जाता है। हम जेनेरिक गेट और सेट के तरीकों का भी उपयोग करते हैं जो किसी विशेष प्रकार के एक सरणी तत्व को पढ़ने और सेट करने के लिए उपयोग किया जाता है।
तब हम इस सरणी वर्ग के उदाहरण बनाते हैं। उदाहरण बनाते समय, हम वांछित प्रकार निर्दिष्ट कर सकते हैं। उपरोक्त कार्यक्रम में, हमने इंटर्जर और स्ट्रिंग के दो सरणियों का निर्माण किया है और फिर हम इन सरणियों को उचित मूल्यों (सेट विधि का उपयोग करके) के साथ आबाद करते हैं।
अंत में ओवरराइड ‘toString’ विधि का उपयोग करके हम इनमें से प्रत्येक उदाहरण की सामग्री प्रदर्शित करते हैं।
चिंतन का उपयोग करना
इस दृष्टिकोण में, हम एक सामान्य वर्ग बनाने के लिए एक परावर्तन वर्ग का उपयोग करते हैं जिसका प्रकार केवल रनटाइम पर जाना जाएगा।
दृष्टिकोण केवल एक अंतर के साथ पिछले एक के समान है यानी हम क्लास कंस्ट्रक्टर को डेटा प्रकार की जानकारी को स्पष्ट रूप से पास करके ऑब्जेक्ट एरे को तुरंत बनाने के लिए कंस्ट्रक्टर में प्रतिबिंब वर्ग का उपयोग करते हैं।
इस प्रकार की जानकारी को प्रतिबिंब की Array.newInstance पद्धति में दिया जाता है।
निम्नलिखित कार्यक्रम जेनेरिक सरणी बनाने के लिए प्रतिबिंब का उपयोग दिखाता है । ध्यान दें कि पूरे कार्यक्रम की संरचना पिछले दृष्टिकोण के समान है और प्रतिबिंब सुविधाओं के उपयोग में अंतर है।
importjava.util.Arrays; class Array { private final E() objArray; public final int length; // class constructor public Array(ClassdataType, int length){ // create a new array with the specified data type and length at runtime using reflection this.objArray = (E()) java.lang.reflect.Array.newInstance(dataType, length); this.length = length; } // get element at objArray(i) Eget(int i) { returnobjArray(i); } // assign e to objArray(i) void set(int i, E e) { objArray(i) = e; } @Override public String toString() { return Arrays.toString(objArray); } } class Main { public static void main(String() args){ final int length = 5; // create array with Integer as data type Arrayint_Array = new Array(Integer.class, length); System.out.print('Generic Array:' + ' '); for (int i = 0; i आउटपुट:

उपरोक्त कार्यक्रम दो प्रकारों के सरणियों को दर्शाता है अर्थात् एर्गर्स और स्ट्रिंग एरेस जेनेरिक क्लास से बनाया गया है।
जेनेरिक ऐरे क्रिएशन एरर
हमने पहले ही जावा में जेनेरिक सरणियों के निर्माण के निहितार्थों पर चर्चा की है और जावा में जेनेरिक सरणियों का होना क्यों संभव नहीं है। इसका एक और स्पष्टीकरण यह है कि जावा में सरणियाँ सहसंयोजक हैं, जबकि जेनरिक नहीं हैं। जेनरिक अपरिवर्तनीय हैं।
सहसंयोजक द्वारा, हमारा मतलब है कि उपप्रकार की एक सरणी को इसके सुपरटेप संदर्भ को सौंपा जा सकता है।
इसका अर्थ है कि निम्नलिखित कथन ठीक काम करेगा।
Number numArray() = new Integer(10);
जैसा कि इंटेगर संख्या का एक उपप्रकार है, उपरोक्त कथन ठीक संकलन करता है।
लेकिन अगर हम जेनेरिक के साथ एक ही अवधारणा का उपयोग करते हैं, तो यह काम नहीं करेगा यानी जेनेरिक के साथ, हम एक सुपर-टाइप जेनेरिक को उपप्रकार जेनेरिक असाइन नहीं कर सकते।
बयान, लिस्टोबजलिस्ट = नया एरियरिस्ट (); एक संकलन त्रुटि देगा क्योंकि जेनेरिक एरियर्स की तरह सहसंयोजक नहीं हैं।
उपरोक्त कारण को ध्यान में रखते हुए, हम नीचे भी कुछ पसंद नहीं कर सकते हैं:
वेबसाइटों एमपी 3 के लिए यूट्यूब वीडियो डाउनलोड करने के लिए
public static ArrayList() myarray = new ArrayList(2);
यह कथन त्रुटि के साथ संकलित करने में विफल रहेगा, 'सामान्य सरणी निर्माण' जैसा कि हम एक विशिष्ट सामान्य प्रकार के संदर्भों की एक सरणी की घोषणा नहीं कर सकते।
हालाँकि, हम वाइल्डकार्ड का उपयोग करके एक विशिष्ट सामान्य प्रकार के संदर्भों की एक सरणी बना सकते हैं। उपरोक्त विवरण को वाइल्डकार्ड का उपयोग करने के थोड़े बदलाव के साथ सफलतापूर्वक संकलित किया जा सकता है जैसा कि नीचे दिखाया गया है।
public static ArrayListmyarray = new ArrayList(5);
उपरोक्त कथन सफलतापूर्वक संकलित होगा।
निम्नलिखित कार्यक्रम वाइल्डकार्ड का उपयोग करने का एक प्रदर्शन दिखाता है।
कैसे ग्रहण में एक नई जावा फ़ाइल बनाने के लिए
import java.util.*; //generic array class classArr { T tarray(); Arr(T myarray()) { tarray = myarray; } @Override public String toString() { return Arrays.toString(tarray); } } public class Main { public static void main(String() args) { // Arrtarray() = new Arr(5); //error: generic array creation //initialize new array objects Arr arr1 = new Arr(new Integer(){2,4,6,8,10}); System.out.print('Array with Integer type:' + ' '); System.out.println(arr1); Arr arr2 = new Arr(new String(){'aa', 'bb', 'cc', 'dd'}); System.out.print('Array with String type:' + ' '); System.out.println(arr2); //define array objects using wildcard Arrarr3() = new Arr(5); arr3(0) = new Arr(new Integer(){10, 20, 30, 40, 50}); System.out.println('Integer array: ' + arr3(0)); arr3(1) = new Arr(new Float(){1.1f, 2.2f, 3.3f, 4.4f, 5.5f}); System.out.println('Float array: ' + arr3(1)); } }
आउटपुट:

उपरोक्त कार्यक्रम में, हमारे पास मुख्य विधि में पहला बयान है जो जेनेरिक के आक्रमण को इंगित करता है। यह कथन संकलन त्रुटि (टिप्पणियों में दिखाया गया है) को फ्लैश करेगा। अगली व्यूह रचना जेनरिक के नियमों के अनुसार है और इस प्रकार वे सफलतापूर्वक संकलन करते हैं।
बार बार पूछे जाने वाले प्रश्न
Q # 1) जेनेरिक एरे क्या है?
उत्तर: एरर्स जो डेटा प्रकार से स्वतंत्र होते हैं और जिनकी सूचना का प्रकार रनटाइम पर मूल्यांकन किया जाता है, जेनेरिक एरेज़ हैं। जेनरिक C ++ में टेम्प्लेट के समान हैं।
Q # 2) क्या आप जावा में जेनेरिक ऐरे बना सकते हैं?
उत्तर: Arrays जावा में सहसंयोजक हैं यानी किसी भी उपवर्ग सरणी को सुपरटाइप सरणी में सौंपा जा सकता है। जेनरिक, हालांकि, अपरिवर्तनीय हैं यानी आप सुपरक्लास प्रकार को उप-वर्ग प्रकार नहीं दे सकते हैं।
दूसरे, जेवीएम से जेनेरिक जानकारी को हटा दिया जाता है और इस प्रकार, जिस सरणी का मेमोरी आवंटन रनटाइम पर किया जाता है, वह नहीं जानता कि किस प्रकार को सरणी को सौंपा जाना है। इस प्रकार, जावा में सरणियाँ और जेनरिक एक साथ अच्छी तरह से नहीं चलते हैं।
Q # 3) जावा में टाइप ई क्या है?
उत्तर: जेनेरिक के लिए प्लेसहोल्डर के रूप में कार्य करता है और किसी भी प्रकार के तत्व का प्रतिनिधित्व करता है।
Q # 4) जावा में टाइप एरासुरे क्या है?
उत्तर: जावा कंपाइलर द्वारा की गई एक प्रक्रिया जिसके द्वारा जेनेरिक में उपयोग किए जाने वाले पैरामीटर प्रकारों को हटा दिया जाता है और बाइट कोड में कच्चे प्रकारों में मैप किया जाता है। जैसे, बाइट कोड में जेनरिक पर कोई जानकारी नहीं है।
Q # 5) जावा में एक रॉ टाइप क्या है?
उत्तर: रॉ प्रकार सामान्य पैरामीटर का उपयोग किए बिना सामान्य प्रकार हैं। जैसे सूची एक कच्चा प्रकार है; जबकि सूची एक पैरामीटर प्रकार है।
निष्कर्ष
जावा में, जेनेरिक एरे को सीधे परिभाषित नहीं किया जा सकता है यानी आपके पास एक ऐरे संदर्भ के लिए असाइन किया गया पैरामीटर प्रकार नहीं हो सकता है। हालांकि, ऑब्जेक्ट सरणियों और प्रतिबिंब सुविधाओं का उपयोग करके, आप सामान्य सरणी निर्माण का अनुकरण कर सकते हैं।
हमने इस ट्यूटोरियल में इन दो दृष्टिकोणों को जेनेरिक एरे क्रिएशन एरर और इस तरह की त्रुटि को रोकने की संभावनाओं के विवरण के साथ देखा है। संक्षेप में, जावा में, आप कह सकते हैं कि सरणियाँ और जेनेरिक हाथ से नहीं चलते हैं क्योंकि सरणियाँ सहसंयोजक होती हैं जबकि जेनरिक अपरिवर्तनीय होती हैं।
=> यहाँ बिल्कुल सही जावा प्रशिक्षण गाइड देखें।
अनुशंसित पाठ
- जावा ऐरे - जावा में ऐरे के तत्वों को कैसे प्रिंट करें?
- जावा सरणी कोड कोड के साथ लंबाई ट्यूटोरियल
- उदाहरणों के साथ जावा परावर्तन ट्यूटोरियल
- जावा ऐरे - घोषणा, जावा में एक ऐरे को बनाएँ और आरम्भ करें
- जावा एरेज़ और संबंधित अवधारणाओं का परिचय
- उदाहरण के साथ जावा जेनरिक ट्यूटोरियल
- Java SWING Tutorial: कंटेनर, कंपोनेंट्स एंड इवेंट हैंडलिंग
- जावा डाटाटेप्स, लूप्स, एरेस, स्विच एंड एसेसरीज