"हाय! मी एलीचा जेनेरिकचा धडा सुरू ठेवणार आहे. ऐकण्यासाठी तयार आहात?"

"हो."

"मग सुरुवात करूया."

"पहिली गोष्ट तुम्हाला माहित असणे आवश्यक आहे की वर्गाच्या पद्धतींमध्ये त्यांचे स्वतःचे प्रकार पॅरामीटर्स देखील असू शकतात."

"मला माहित आहे."

"नाही, मला विशेषत: त्यांचे स्वतःचे प्रकार पॅरामीटर्स म्हणायचे आहे: "

उदाहरण
class Calculator
{
  T add(T a, T b); // Add
  T sub(T a, T b); // Subtract
  T mul(T a, T b); // Multiply
  T div(T a, T b); // Divide
}

"हे प्रकार पॅरामीटर्स विशेषतः पद्धतींशी संबंधित आहेत. वर्गात पॅरामीटर्स नाहीत. तुम्ही या पद्धती स्थिर घोषित देखील करू शकता आणि त्यांना ऑब्जेक्टशिवाय कॉल करू शकता."

"मला दिसत आहे. पद्धतींमध्ये टाइप पॅरामीटर्सचा बिंदू वर्गांसाठी समान आहे?"

"हो. पण काहीतरी नवीन आहे."

"तुम्हाला आधीच माहिती आहे, तुम्ही टाइप डिक्लेरेशनमध्ये वाइल्डकार्ड वापरू शकता. नंतर खालील परिस्थितीची कल्पना करा:"

उदाहरण १
public void doSomething(List<? extends MyClass> list)
{
 for(MyClass object : list)
 {
  System.out.println(object.getState()); // Everything works well here.
 }
}

"परंतु आम्हाला संग्रहात नवीन आयटम जोडायचा असेल तर:"

उदाहरण २
public void doSomething(List<? extends MyClass> list)
{
 list.add(new MyClass()); // Error!
}

"समस्या अशी आहे की सर्वसाधारणपणे doSomething पद्धत अशी सूची पास केली जाऊ शकते ज्याचे घटक MyClass ऑब्जेक्ट नसून MyClass च्या कोणत्याही सबक्लासचे ऑब्जेक्ट आहेत. परंतु आपण अशा सूचीमध्ये MyClass ऑब्जेक्ट जोडू शकत नाही!"

"अहो. मग त्याबद्दल काय करता येईल?"

"काही नाही. या परिस्थितीत, तुम्ही काहीही करू शकत नाही. पण यामुळे Java च्या निर्मात्यांना विचार करण्यासारखे काहीतरी मिळाले. आणि त्यांनी एक नवीन कीवर्ड आणला: super ."

"वाक्यरचना जवळजवळ सारखीच दिसते:"

List<? super MyClass> list

परंतु विस्तार आणि सुपरमध्ये एक महत्त्वाचा फरक आहे.

"«? T वाढवतो» म्हणजे वर्ग हा T चा वंशज असणे आवश्यक आहे."

"«? सुपर T» म्हणजे वर्ग हा T चा पूर्वज असणे आवश्यक आहे."

"होली मोली. मग हे कुठे वापरले आहे?"

"«? सुपर T» वापरला जातो जेव्हा एखाद्या पद्धतीमध्ये T वस्तूंच्या संग्रहामध्ये जोडणे समाविष्ट असते. या प्रकरणात, तो T वस्तूंचा संग्रह किंवा Tचा कोणताही पूर्वज असू शकतो."

"आह. AT ऑब्जेक्ट एका संदर्भ व्हेरिएबलला नियुक्त केला जाऊ शकतो ज्याचा प्रकार T च्या पूर्वजांपैकी कोणताही आहे"

"प्रामाणिकपणे, हा दृष्टिकोन खूप वेळा वापरला जात नाही. इतकेच काय, त्यात एक कमतरता आहे. उदाहरणार्थ:"

उदाहरणे
public void doSomething(List<? super MyClass> list)
{
 for(MyClass object : list) // Error!
 {
  System.out.println(object.getState());
 }
}
public void doSomething(List<? super MyClass> list)
{
 list.add(new MyClass()); // Everything works well here.
}

"आता पहिले उदाहरण काम करत नाही."

"सूची ही सूची<ऑब्जेक्ट> देखील असू शकते (ऑब्जेक्ट मायक्लासचा सर्वोच्च सुपरक्लास आहे), आम्ही मूलत: खालील अवैध कोड लिहित आहोत:"

उदाहरण १
List<Object> list; 

for(MyClass object : list) // Error!
{ 
 System.out.println(object.getState()); 
}

"मी पाहतो. मनोरंजक धड्याबद्दल धन्यवाद."

"तुमचे स्वागत आहे."