जावा - जेनरिक

यह अच्छा होगा यदि हम एक एकल प्रकार की विधि लिख सकते हैं जो एक पूर्णांक सरणी, एक स्ट्रिंग सरणी या तत्वों के किसी भी प्रकार को क्रमबद्ध करने में सहायक हो सकती है।

जावा Generic विधियाँ और सामान्य कक्षाएं प्रोग्रामर को निर्दिष्ट करने के लिए सक्षम करती हैं, एक एकल विधि घोषणा, संबंधित विधियों का एक समूह, या एकल वर्ग घोषणा के साथ, संबंधित प्रकारों का एक सेट, क्रमशः।

जेनरिक संकलन-समय प्रकार की सुरक्षा भी प्रदान करते हैं जो प्रोग्रामर को संकलन के समय अवैध प्रकारों को पकड़ने की अनुमति देता है।

जावा जेनेरिक अवधारणा का उपयोग करते हुए, हम वस्तुओं की एक सरणी को सॉर्ट करने के लिए एक सामान्य विधि लिख सकते हैं, फिर सरणी तत्वों को सॉर्ट करने के लिए इंटेगर सरणियों, डबल सरणियों, स्ट्रिंग सरणियों और इसी तरह से सामान्य विधि को लागू करें।

सामान्य तरीके

आप एक एकल सामान्य विधि घोषणा लिख ​​सकते हैं जिसे विभिन्न प्रकार के तर्कों के साथ कहा जा सकता है। जेनेरिक विधि को पारित किए गए तर्कों के प्रकार के आधार पर, कंपाइलर प्रत्येक विधि कॉल को उचित तरीके से संभालता है। जेनेरिक विधियों को परिभाषित करने के नियम निम्नलिखित हैं -

  • सभी जेनेरिक विधि घोषणाओं में कोण कोष्ठक (<और>) द्वारा टाइप किया गया एक पैरामीटर पैरामीटर सेक्शन होता है, जो विधि के रिटर्न टाइप (अगले उदाहरण में <E>) से पहले होता है।

  • प्रत्येक प्रकार के पैरामीटर सेक्शन में कॉमा द्वारा अलग किए गए एक या अधिक प्रकार के पैरामीटर होते हैं। एक प्रकार का पैरामीटर, जिसे एक प्रकार चर के रूप में भी जाना जाता है, एक पहचानकर्ता है जो एक सामान्य प्रकार का नाम निर्दिष्ट करता है।

  • प्रकार पैरामीटर का उपयोग रिटर्न प्रकार की घोषणा करने के लिए किया जा सकता है और जेनेरिक विधि को पारित किए गए तर्कों के प्रकार के लिए प्लेसहोल्डर के रूप में कार्य करते हैं, जिन्हें वास्तविक प्रकार के तर्क के रूप में जाना जाता है।

  • जेनेरिक विधि का शरीर किसी अन्य विधि की तरह घोषित किया जाता है। ध्यान दें कि टाइप पैरामीटर केवल संदर्भ प्रकारों का प्रतिनिधित्व कर सकते हैं, न कि आदिम प्रकार (जैसे इंट, डबल और चार)।

उदाहरण

निम्नलिखित उदाहरण से पता चलता है कि कैसे हम एकल जेनेरिक पद्धति का उपयोग करके विभिन्न प्रकार के एक सरणी को प्रिंट कर सकते हैं -

public class GenericMethodTest {
   // generic method printArray
   public static < E > void printArray( E[] inputArray ) {
      // Display array elements
      for(E element : inputArray) {
         System.out.printf("%s ", element);
      }
      System.out.println();
   }

   public static void main(String args[]) {
      // Create arrays of Integer, Double and Character
      Integer[] intArray = { 1, 2, 3, 4, 5 };
      Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
      Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

      System.out.println("Array integerArray contains:");
      printArray(intArray);   // pass an Integer array

      System.out.println("\nArray doubleArray contains:");
      printArray(doubleArray);   // pass a Double array

      System.out.println("\nArray characterArray contains:");
      printArray(charArray);   // pass a Character array
   }
}

यह निम्नलिखित परिणाम का उत्पादन करेगा -

उत्पादन

Array integerArray contains:
1 2 3 4 5 

Array doubleArray contains:
1.1 2.2 3.3 4.4 

Array characterArray contains:
H E L L O

बाउंडेड टाइप पैरामीटर्स

ऐसे समय हो सकते हैं जब आप उन प्रकारों को प्रतिबंधित करना चाहते हैं, जिन्हें एक प्रकार के पैरामीटर को पारित करने की अनुमति है। उदाहरण के लिए, संख्याओं पर काम करने वाला एक तरीका केवल संख्या या उसके उपवर्गों के उदाहरणों को स्वीकार करना चाहता है। यह वह है जो बंधे हुए प्रकार के मापदंडों के लिए है।

एक बंधे हुए प्रकार के पैरामीटर को घोषित करने के लिए, टाइपकर्ता का नाम टाइप करें, उसके बाद विस्तारित कीवर्ड, उसके ऊपरी बाउंड के बाद।

उदाहरण

निम्नलिखित उदाहरण से पता चलता है कि सामान्य अर्थों में "एक्सटेंड्स" (जैसा कि कक्षाओं में) या "इम्प्लीमेंट्स" (जैसा कि इंटरफेस में) का उपयोग किया जाता है। यह उदाहरण जेनेरिक विधि है कि तीन तुलनात्मक वस्तुओं की सबसे बड़ी राशि लौटाएं -

public class MaximumTest {
   // determines the largest of three Comparable objects
   
   public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
      T max = x;   // assume x is initially the largest
      
      if(y.compareTo(max) > 0) {
         max = y;   // y is the largest so far
      }
      
      if(z.compareTo(max) > 0) {
         max = z;   // z is the largest now                 
      }
      return max;   // returns the largest object   
   }
   
   public static void main(String args[]) {
      System.out.printf("Max of %d, %d and %d is %d\n\n", 
         3, 4, 5, maximum( 3, 4, 5 ));

      System.out.printf("Max of %.1f,%.1f and %.1f is %.1f\n\n",
         6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ));

      System.out.printf("Max of %s, %s and %s is %s\n","pear",
         "apple", "orange", maximum("pear", "apple", "orange"));
   }
}

यह निम्नलिखित परिणाम का उत्पादन करेगा -

उत्पादन

Max of 3, 4 and 5 is 5

Max of 6.6,8.8 and 7.7 is 8.8

Max of pear, apple and orange is pear

सामान्य वर्ग

एक सामान्य श्रेणी की घोषणा गैर-जेनेरिक श्रेणी की घोषणा की तरह दिखती है, सिवाय इसके कि कक्षा का नाम एक प्रकार के पैरामीटर अनुभाग के बाद है।

जेनेरिक विधियों के साथ, जेनेरिक क्लास के प्रकार पैरामीटर सेक्शन में कॉमा द्वारा अलग किए गए एक या अधिक प्रकार के पैरामीटर हो सकते हैं। इन वर्गों को मानकीकृत कक्षाओं या पैरामीटर प्रकारों के रूप में जाना जाता है क्योंकि वे एक या अधिक मापदंडों को स्वीकार करते हैं।

उदाहरण

निम्नलिखित उदाहरण दिखाता है कि हम एक सामान्य वर्ग को कैसे परिभाषित कर सकते हैं -

public class Box<T> {
   private T t;

   public void add(T t) {
      this.t = t;
   }

   public T get() {
      return t;
   }

   public static void main(String[] args) {
      Box<Integer> integerBox = new Box<Integer>();
      Box<String> stringBox = new Box<String>();
    
      integerBox.add(new Integer(10));
      stringBox.add(new String("Hello World"));

      System.out.printf("Integer Value :%d\n\n", integerBox.get());
      System.out.printf("String Value :%s\n", stringBox.get());
   }
}

यह निम्नलिखित परिणाम का उत्पादन करेगा -

उत्पादन

Integer Value :10
String Value :Hello World