Java Generics: कोणीय कोष्ठकों से डरना छोड़ें और मजबूत कोड लिखना शुरू करें
\n\nJava की दुनिया में एक चीज़ है जो नए डेवलपर्स को मल्टीथ्रेडिंग से भी ज़्यादा डराती है - वो हैं कोणीय कोष्ठक <>। Generics (जिन्हें जेनेरिक्स या सामान्यीकरण भी कहा जाता है) देखने में रहस्यमय लगते हैं, लेकिन असल में ये साफ और सुरक्षित कोड लिखने में आपके सबसे अच्छे साथी हैं। आइए उदाहरणों के साथ समझते हैं कि Java में टाइपिंग कैसे काम करती है, जिसे आप आज ही अपने प्रोजेक्ट में लागू कर सकते हैं।
सोचिए: आप एक ऐसा मेथड लिख रहे हैं जो numbers, strings और आपकी खुद की क्लासेज़ के साथ काम करे। Generics के बिना आपको दर्जनों ओवरलोडेड मेथड बनाने पड़ते या Object का उपयोग करके बार-बार टाइप चेक करना पड़ता। Java Generics इस समस्या को सुरक्षित और सुंदर तरीके से हल करते हैं।
Generics के बिना कोड क्यों खतरनाक हो जाता है?
\n\nचलिए याद करते हैं कि Java 5 से पहले प्रोग्रामर कैसे काम करते थे। अगर आपने कभी ArrayList बिना टाइप बताए लिखा है, तो आप जानते हैं यह कितना बुरा सपना है:
List list = new ArrayList();\nlist.add("नमस्ते");\nlist.add(42);\nlist.add(new Object());\n\n// कोड की 100 लाइनों के बाद:\nString text = (String) list.get(1); // रनटाइम पर ClassCastException!\n\nयह क्लासिक समस्या है: ClassCastException - एक एरर जो सिर्फ रनटाइम पर दिखती है। आपने लिस्ट किसी और मेथड को दी, और वहाँ किसी को लगता है कि इसमें सिर्फ strings हैं। और धमाका! आपका एप्लिकेशन क्रैश। Java में Generics टाइप चेकिंग को कम्पाइल टाइम पर ले आते हैं - यह ऐसा है जैसे गाड़ी चलाने से पहले ही बीमा लगा लेना।
\n\nJava Generics: बुनियादी सिंटैक्स जो आपको जानना चाहिए
\n\nGenerics की मूल बात सरल है: हम क्लास या मेथड को टाइप से पैरामीटराइज़ करते हैं। किसी खास टाइप की जगह हम टाइप पैरामीटर लिखते हैं (आमतौर पर एक बड़ा अक्षर: T, E, K, V)।
सबसे लोकप्रिय उदाहरण - Java Collections:
\n\n// Generics के बिना - खतरनाक\nList rawList = new ArrayList();\n\n// Generics के साथ - सुरक्षित\nList<String> safeList = new ArrayList<>();\nsafeList.add("Java");\nsafeList.add("Generics");\n// safeList.add(123); // कम्पाइल एरर!\n\nअब कम्पाइलर जानता है: safeList में सिर्फ strings ही आ सकते हैं। कोई नंबर डालने की कोशिश कम्पाइल टाइम पर ही एरर देगी, रनटाइम पर नहीं। यही है Java टाइप सेफ्टी असल में।
अपनी पहली generic क्लास बनाएँ
\n\nमान लीजिए हम एक सिंपल कंटेनर बना रहे हैं जो एक वैल्यू स्टोर करे। Generics के बिना हमें Object का उपयोग करना पड़ता:
public class Box {\n private Object value;\n\n public void set(Object value) { this.value = value; }\n public Object get() { return value; }\n}\n\nऔर अब - Generics के साथ:
\n\npublic class Box<T> {\n private T value;\n\n public void set(T value) { this.value = value; }\n public T get() { return value; }\n}\n\n// उपयोग:\nBox<Integer> intBox = new Box<>();\nintBox.set(100);\nint value = intBox.get(); // बिना कास्ट के!\n\nध्यान दें: अब हमें (Integer) intBox.get() लिखने की ज़रूरत नहीं। कम्पाइलर खुद जानता है कि get() Integer लौटाएगा। यही है Java Generics का जादू।
Java में टाइपिंग: सीमाएँ और Wildcards
\n\nGenerics बहुत सरल होते अगर उनमें कुछ बारीकियाँ न होतीं। सबसे महत्वपूर्ण है - bounded type parameters (सीमित टाइप पैरामीटर)। कभी-कभी हमें कहना होता है: "टाइप T एक नंबर होना चाहिए" या "T को Comparable इंटरफ़ेस लागू करना चाहिए"।
\n\n// T सिर्फ Number या उसका सबक्लास हो सकता है\npublic class Calculator<T extends Number> {\n private T value;\n\n public double square() {\n return value.doub