"हाय! मैं जेनरिक पर ऐली का पाठ जारी रखने जा रहा हूं। सुनने के लिए तैयार हूं?"
"हाँ।"
"तो चलिए शुरू करते हैं।"
"पहली बात जो आपको जानने की जरूरत है वह यह है कि एक वर्ग के तरीकों के अपने प्रकार के पैरामीटर भी हो सकते हैं।"
"मुझे पता है।"
"नहीं, मैं विशेष रूप से उनके अपने प्रकार के मापदंडों का मतलब है: "
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!
}
"समस्या यह है कि सामान्य मामले में डूसमथिंग विधि एक सूची पारित की जा सकती है जिसके तत्व MyClass ऑब्जेक्ट नहीं हैं, बल्कि MyClass के किसी भी उपवर्ग की वस्तुएं हैं। लेकिन आप ऐसी सूची में MyClass ऑब्जेक्ट्स नहीं जोड़ सकते हैं!"
"आह। तो, उसके बारे में क्या किया जा सकता है?"
"कुछ नहीं। इस स्थिति में, आप कुछ नहीं कर सकते। लेकिन इसने जावा के निर्माताओं को सोचने के लिए कुछ दिया। और वे एक नया कीवर्ड लेकर आए: सुपर ।"
"वाक्यविन्यास लगभग समान दिखता है:"
List<? super MyClass> list
लेकिन विस्तार और सुपर के बीच एक महत्वपूर्ण अंतर है।
"«? एक्सटेंड्स टी» का अर्थ है कि वर्ग को टी का वंशज होना चाहिए।"
"«? सुपर टी» का अर्थ है कि वर्ग को टी का पूर्वज होना चाहिए।"
"पवित्र मोली। तो यह कहाँ प्रयोग किया जाता है?"
"«? सुपर टी» का उपयोग तब किया जाता है जब एक विधि में टी वस्तुओं के संग्रह में जोड़ना शामिल होता है। इस मामले में, यह टी वस्तुओं या टी के किसी पूर्वज का संग्रह हो सकता है।
"आह। एटी ऑब्जेक्ट को संदर्भ चर के लिए असाइन किया जा सकता है जिसका प्रकार टी के पूर्वजों में से कोई है"
"ईमानदारी से, इस दृष्टिकोण का बहुत बार उपयोग नहीं किया जाता है। क्या अधिक है, इसमें एक कमी है। उदाहरण के लिए:"
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.
}
"अब पहला उदाहरण काम नहीं करता है।"
"चूंकि सूची एक सूची <ऑब्जेक्ट> भी हो सकती है (ऑब्जेक्ट MyClass का सर्वोच्च सुपरक्लास है), हम अनिवार्य रूप से निम्नलिखित अमान्य कोड लिख रहे हैं:"
List<Object> list;
for(MyClass object : list) // Error!
{
System.out.println(object.getState());
}
"समझ गया। दिलचस्प पाठ के लिए धन्यवाद।"
"आपका स्वागत है।"
GO TO FULL VERSION