आपके प्रश्न में शुरू में आपके द्वारा संदर्भित अवधारणा को सहसंयोजक रिटर्न प्रकार कहा जाता है ।
सहसंयोजक वापसी प्रकार काम करते हैं क्योंकि एक विधि कुछ प्रकार के ऑब्जेक्ट को वापस करने के लिए होती है और ओवरराइडिंग तरीके वास्तव में इसका एक उपवर्ग वापस कर सकते हैं। जावा जैसी भाषा के S
उप- नियमों के आधार पर, यदि इसका उप-प्रकार है T
, तो जहां भी T
हम प्रकट होते हैं, हम उसे पास कर सकते हैं S
।
जैसे कि एक ऐसी S
विधि को ओवरराइड करके वापस लौटना सुरक्षित है, जिसकी उम्मीद की जाती है T
।
आपका सुझाव यह स्वीकार करने के लिए कि एक ओवरराइडिंग विधि, उन तर्कों का उपयोग करती है जो ओवरराइड विधि द्वारा अनुरोधित लोगों के उपप्रकार हैं, यह अधिक जटिल है क्योंकि यह टाइप सिस्टम में असत्यता की ओर जाता है।
एक हाथ से, ऊपर वर्णित एक ही उप-नियम द्वारा, सबसे अधिक संभावना है कि यह पहले से ही आप क्या करना चाहते हैं के लिए काम करता है। उदाहरण के लिए
interface Hunter {
public void hunt(Animal animal);
}
कुछ भी नहीं इस वर्ग के कार्यान्वयन को किसी भी प्रकार के जानवर को प्राप्त करने से रोकता है, क्योंकि यह पहले से ही आपके प्रश्न में मानदंडों को संतुष्ट करता है।
लेकिन मान लें कि जैसा आपने सुझाया था, हम इस विधि को ओवरराइड कर सकते हैं:
class MammutHunter implements Hunter {
@Override
public void hunt(Mammut animal) {
}
}
यहाँ मज़ेदार हिस्सा है, अब आप यह कर सकते हैं:
AnimalHunter hunter = new MammutHunter();
hunter.hunt(new Bear()); //Uh oh
AnimalHunter
आप के सार्वजनिक इंटरफ़ेस के अनुसार किसी भी जानवर का शिकार करने में सक्षम होना चाहिए, लेकिन आपके कार्यान्वयन के अनुसार MammutHunter
आप केवल Mammut
वस्तुओं को स्वीकार करते हैं। इसलिए ओवरराइड विधि सार्वजनिक इंटरफ़ेस को संतुष्ट नहीं करती है। हमने यहां टाइप सिस्टम की ध्वनि को तोड़ दिया।
आप जेनेरिक का उपयोग करके आप जो चाहें लागू कर सकते हैं।
interface AnimalHunter<T extends Animal> {
void hunt(T animal);
}
तब आप अपने MammutHunter को परिभाषित कर सकते हैं
class MammutHunter implements AnimalHunter<Mammut> {
void hunt(Mammut m){
}
}
और जेनेरिक कोवरिएनस और कंट्रोवर्सी का उपयोग करके आप आवश्यक होने पर नियमों को अपने पक्ष में आराम कर सकते हैं। उदाहरण के लिए हम यह सुनिश्चित कर सकते हैं कि एक स्तनपायी शिकारी केवल दिए गए संदर्भ में शिकार का शिकार कर सकता है:
AnimalHunter<? super Feline> hunter = new MammalHunter();
hunter.hunt(new Lion());
hunter.hunt(new Puma());
MammalHunter
लागू करने की आपूर्ति AnimalHunter<Mammal>
।
उस स्थिति में यह स्वीकार नहीं किया जाएगा:
hunter.hunt(new Mammut()):
यहां तक कि जब स्तनधारी स्तनधारी होते हैं तो यह हमारे द्वारा उपयोग किए जा रहे विरोधाभासी प्रकार पर प्रतिबंध के कारण स्वीकार नहीं किया जाएगा। इसलिए, आप अभी भी कुछ नियंत्रकों को उन प्रकारों पर कर सकते हैं जो आपके द्वारा उल्लिखित चीजों की तरह हैं।