Java में Generics: शुरुआती लोगों के लिए इनकी आवश्यकता और उपयोग कैसे करें
Java सीखते समय, देर-सबेर आप Generics (जेनेरिक्स, सामान्यीकरण) की अवधारणा से परिचित होंगे। शुरुआती लोगों के लिए यह जटिल लग सकता है, लेकिन वास्तव में यह भाषा के सबसे उपयोगी उपकरणों में से एक है। इस लेख में, हम समझेंगे कि Generics क्या है, इसकी आवश्यकता क्यों है और इसका सही उपयोग कैसे करें। यह सामग्री शुरुआती डेवलपर्स के लिए है।
Generics क्या है और इसके बिना समस्या क्या है?
Generics (सामान्यीकरण) Java का एक तंत्र है जो प्रकारों को पैरामीटराइज़ करने की अनुमति देता है। सरल शब्दों में, आप एक क्लास, इंटरफ़ेस या मेथड लिख सकते हैं जो विभिन्न डेटा प्रकारों के साथ काम करेगा, लेकिन कंपाइलेशन के समय सख्त टाइपिंग बनाए रखेगा।
कल्पना करें कि आप एक बॉक्स बनाना चाहते हैं जिसमें आप कोई भी वस्तु रख सकें। Generics के बिना, आपको Object का उपयोग करना होगा:
public class Box { private Object item;
public void put(Object item) { this.item = item; }
public Object get() { return item; }}ऐसी क्लास का उपयोग करना एक कठिन काम है:
Box box = new Box();box.put("Hello");// निकालते समय स्पष्ट रूप से प्रकार बदलना होगाString text = (String) box.get(); // ClassCastException का जोखिम!यदि आप गलती से एक संख्या डालते हैं और फिर इसे स्ट्रिंग में बदलने का प्रयास करते हैं, तो प्रोग्राम रनटाइम पर त्रुटि के साथ क्रैश हो जाएगा। Generics इस समस्या को हल करते हैं, प्रकारों की जाँच को कंपाइलेशन के समय स्थानांतरित करके।
Generics का उपयोग कैसे करें: मूल सिंटैक्स
आइए अपनी Box क्लास को Generics का उपयोग करके फिर से लिखें:
public class Box<T> { private T item;
public void put(T item) { this.item = item; }
public T get() { return item; }}यहाँ <T> प्रकार का पैरामीटर है। T एक सामान्य नाम है ("Type" शब्द से), लेकिन आप कोई भी अक्षर या शब्द उपयोग कर सकते हैं: E (Element), K (Key), V (Value) आदि।
अब उपयोग सुरक्षित और सुंदर हो गया है:
Box<String> stringBox = new Box<>();stringBox.put("Hello");String text = stringBox.get(); // बदलने की कोई आवश्यकता नहीं!
// यह पंक्ति कंपाइल नहीं होगी:// stringBox.put(123); // कंपाइलेशन त्रुटि!कंपाइलर स्वयं जानता है कि stringBox केवल स्ट्रिंग के साथ काम करता है। यदि आप एक संख्या डालने का प्रयास करते हैं, तो कोड कंपाइल भी नहीं होगा - आपको तुरंत त्रुटि के बारे में पता चल जाएगा, न कि रनटाइम पर।
कलेक्शन में Generics: जहाँ इनकी सबसे अधिक आवश्यकता है
Generics का सबसे लोकप्रिय उपयोग Java कलेक्शन (List, Set, Map और अन्य) में है। जेनेरिक्स के आगमन से पहले (Java 5 में), डेवलपर्स को ArrayList के साथ समस्या होती थी, जो Object संग्रहीत करता था:
// पुरानी शैली (Generics के बिना)List list = new ArrayList();list.add("नमस्ते");list.add(123); // यह भी जोड़ा जा सकता है!
String item = (String) list.get(0); // सामान्यString item2 = (String) list.get(1); // ClassCastException!Generics के साथ सब कुछ सरल और सुरक्षित है:
List<String> names = new ArrayList<>();names.add("Alice");names.add("Bob");// names.add(123); // कंपाइलेशन त्रुटि
for (String name : names) { System.out.println(name.toUpperCase()); // कोई बदलाव नहीं!}यही बात Map के लिए भी काम करती है:
Map<String, Integer> ageMap = new HashMap<>();ageMap.put("Alice", 30);ageMap.put("Bob", 25);
int aliceAge = ageMap.get("Alice"); // स्वचालित अनबॉक्सिंग intसीमाएँ और वाइल्डकार्ड: Generics को लचीला कैसे बनाएं
कभी-कभी आपको यह सीमित करने की आवश्यकता होती है कि जेनेरिक कौन से प्रकार स्वीकार कर सकता है। इसके लिए bounded type parameters (सीमित प्रकार पैरामीटर) का उपयोग किया जाता है।
उदाहरण के लिए