2012-09-15 26 views
12

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

विपरीत पर विपरीत परावर्तक पैरामीटर प्रकार क्यों हैं तरीकों को ओवरराइड करते समय अनुमति दी गई है?

+4

संभावित डुप्लिकेट [ओवरराइडिंग के लिए कोई पैरामीटर कॉन्ट्रैक्ट-वेरिएंस क्यों नहीं है?] (Http://stackoverflow.com/questions/2995926/why-is-there-no-parameter-contra-variance-for-overriding) –

+0

धन्यवाद। मैंने इसे देखा है, लेकिन सी ++ में जवाब को समझने में कठिनाइयों थी, क्योंकि मैं सी ++ से पूरी तरह से अपरिचित हूं .. सोचा कि जावा के लिए विशेष रूप से पूछना आसान हो सकता है। – Will

+0

मैंने लिंक किए गए पोस्ट को पढ़ा है और जहां तक ​​मुझे समझ में आता है कि इस सुविधा से लाभ आश्चर्यजनक कारक से अधिक नहीं है। और एक विशिष्ट कार्यान्वयन के लिए ओवरलोडेड विधि प्रदान करना मुश्किल नहीं है। मेरा मतलब है कि इस सुविधा के लिए अन्य उपयोग-मामले क्या हैं? कक्षा पर कॉलिंग विधि को छोड़कर सीधे? –

उत्तर

15

क्योंकि इसे overloading कहा जाता है।

विशेष रूप से, रिटर्न प्रकार का प्रकार कॉन्वेंरिएंट हो सकता है क्योंकि अधिभारित होने पर इसे नहीं माना जाता है, और इसलिए यह अभी भी सुपरक्लास या इंटरफ़ेस के कार्यान्वयन से मेल खाता है। अतिभारित होने पर पैरामीटर्स पर विचार किया जाता है। Number doSomethingWithNumber(Number value) की तुलना में Number doSomethingWithNumber(Integer value) के साथ आपको बहुत अच्छी तरह से अनुकूलन हो सकता है।

+0

माना जाता है कि यह contravariant पैरामीटर होने पर अभी भी ओवरराइडिंग होगा, हम क्या मुद्दों का सामना करेंगे? मैं कुछ ऐसा ढूंढ रहा हूं: http://stackoverflow.com/a/2996901/715236, हालांकि सुपरक्लास में एकाधिक उपरोक्त ओवरराइडिंग में विधि होने के बारे में क्या बुरा होगा? – Will

+0

श्रृंखला में कहीं भी किसी भी बेस प्रकार अधिभार को दिए जाने पर सबसे बड़ी समस्या अधिभार प्रदान करने में असमर्थता होगी। यह पॉलिमॉर्फिक फ़ंक्शन कॉल के साथ कहर बरबाद कर देगा, क्योंकि लुकअप को एक साधारण बराबर हस्ताक्षर से बदलना होगा, बराबर या अधिक बुनियादी हस्ताक्षर के लिए, और यदि आपके पास दोनों हैं तो आपको क्या कॉल करना चाहिए, लेकिन अधिक विशिष्ट कॉल करें? एक डिजाइन परिप्रेक्ष्य से, यदि 'ए बी बढ़ाता है, और' बी सी बढ़ाता है ', लेकिन 'बी' आपके लिंक से 'शून्य एफ (ऑब्जेक्ट ओ)' कार्यान्वयन प्रदान करता है, तो' ए 'को और अधिक लागू करने का कोई अवसर नहीं है विशिष्ट अधिभारित तरीकों। यह एक दुःस्वप्न होगा। – pickypg

+1

सबसे महत्वपूर्ण बात यह है कि, मुझे लगता है कि यह एपीआई का नेतृत्व करेगा जो आलसी ओवरराइड हो जाएंगे, जिसके परिणामस्वरूप बहुत सारे अविश्वसनीय बदसूरत, बॉयलरप्लेट कोड होंगे जो आंतरिक रूप से उपयुक्त विधि को कॉल करने के लिए उपयोग किए जाएंगे: 'शून्य एफ (ऑब्जेक्ट ओ) {if (ओ उदाहरण के पूर्णांक) एफ ((इंटीजर) ओ); } '। और फिर आपको पूछना होगा कि यह कैसे काम करेगा? ओवरराइडिंग व्यवहार की अनुमति देने के लिए, इसका अर्थ यह होगा कि 'ऑब्जेक्ट' पैरामीटर विधि 'इंटेगर' पैरामीटर विधि को ओवरराइड करती है, और इसलिए उपरोक्त कोड एक अनंत रिकर्सिव लूप का कारण बनता है (जब तक ढेर बहती नहीं है) क्योंकि यह ठीक से ' ऑब्जेक्ट 'विधि। – pickypg