Java में Generics: क्यों आवश्यक हैं और कैसे उपयोग करें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Java में Generics: क्यों आवश्यक हैं और कैसे उपयोग करें



Generics (सामान्यीकरण) — Java की प्रमुख विशेषताओं में से एक है, जो J2SE 5.0 संस्करण में शुरू हुई। ये आपको ऐसे क्लास, इंटरफ़ेस और मेथड बनाने की अनुमति देते हैं जो कॉल के समय निर्दिष्ट डेटा प्रकारों के साथ काम करते हैं। Integer, String और Double के लिए अलग-अलग इम्प्लीमेंटेशन लिखने के बजाय, आप एक सार्वभौमिक कोड लिखते हैं। इस लेख में हम समझेंगे कि Java में Generics क्यों आवश्यक हैं, व्यवहार में उनका उपयोग कैसे करें और किन खतरों से सावधान रहना चाहिए।



Java में Generics क्यों आवश्यक हैं?



Generics के आगमन से पहले, डेवलपर्स किसी भी प्रकार को संग्रहीत करने के लिए Object का उपयोग करते थे। यह काम करता था, लेकिन दो गंभीर समस्याएँ पैदा करता था:



  • कम्पाइल समय पर प्रकार जाँच का अभाव। आप गलती से सूची में Integer के बजाय String डाल सकते थे, और त्रुटि केवल प्रोग्राम निष्पादन के दौरान दिखाई देती थी।
  • स्पष्ट प्रकार रूपांतरण की आवश्यकता। कलेक्शन से तत्व निकालते समय हर बार कास्ट करना पड़ता था: (String) list.get(0)। इससे कोड बोझिल और खतरनाक हो जाता था।


Generics दोनों समस्याओं का समाधान करते हैं। वे कम्पाइलर को प्रकारों की शुद्धता जाँचने और स्वचालित रूप से रूपांतरण करने की अनुमति देते हैं। एक सरल उदाहरण देखें:



// Generics के बिना (पुरानी शैली)List list = new ArrayList();list.add("Hello");String s = (String) list.get(0); // स्पष्ट रूपांतरण आवश्यक

// Generics के साथList<String> list = new ArrayList<>();list.add("Hello");String s = list.get(0); // रूपांतरण की आवश्यकता नहीं


कोड अधिक सुरक्षित और पढ़ने में आसान हो गया। प्रकार की त्रुटि कम्पाइल समय पर पकड़ी जाती है, रनटाइम पर नहीं।



Generics का उपयोग कैसे करें: मुख्य संरचनाएँ



1. Generic-क्लास



आप एक ऐसा क्लास परिभाषित कर सकते हैं जो एक या अधिक प्रकार पैरामीटर स्वीकार करता है। अक्सर एक अक्षर का उपयोग किया जाता है: T (Type), E (Element), K (Key), V (Value)।



public class Box<T> {    private T content;

public void put(T item) { this.content = item; }

public T get() { return content; }}

// उपयोगBox<String> stringBox = new Box<>();stringBox.put("Java");String value = stringBox.get(); // स्वचालित रूपांतरण


पैरामीटर T ऑब्जेक्ट बनाते समय वास्तविक प्रकार से बदल दिया जाता है। कम्पाइलर गारंटी देता है कि Box<String> में Integer नहीं डाला जा सकता।



2. Generic-मेथड



मेथड भी सामान्यीकृत हो सकते हैं, भले ही क्लास generic न हो। प्रकार पैरामीटर रिटर्न प्रकार से पहले निर्दिष्ट किया जाता है:



public class Utils {    public static <T> T getMiddle(T... args) {        return args[args.length / 2];    }}

// कॉलString middle = Utils.<String>getMiddle("A", "B", "C");// या बस: Utils.getMiddle("A", "B", "C") — कम्पाइलर प्रकार निकालेगा


Generic-मेथड विभिन्न डेटा प्रकारों के साथ काम करने वाले उपयोगिता फंक्शन के लिए उपयोगी होते हैं।



3. सीमित प्रकार (Bounded Type Parameters)



कभी-कभी यह सीमित करना आवश्यक होता है कि कौन से प्रकार प्रतिस्थापित किए जा सकते हैं। उदाहरण के लिए, मेथड को केवल संख्याओं के साथ काम करने के लिए:



public class Calculator {    public static <T extends Number> double sum(T a, T b) {        return a.doubleValue() + b.doubleValue();    }}

// Integer, Double, Float आदि के साथ काम करता हैdouble result = Calculator.sum(5, 10); // 15.0


कीवर्ड extends का अर्थ है कि T निर्दिष्ट क्लास का उपप्रकार होना चाहिए (या इंटरफ़ेस को लागू करना चाहिए)।



Wildcards: अज्ञात प्रकार



Wildcards (प्लेसहोल्डर प्रतीक) का उपयोग तब किया जाता है जब सटीक प्रकार अज्ञात या महत्वहीन हो। इसे प्रश्न चिह्न ? से दर्शाया जाता है। तीन प्रकार हैं: