2009-11-04 9 views
5

क्या एक ही नाम के साथ दो विधियां हो सकती हैं लेकिन जावा में अलग-अलग पैरामीटर और रिटर्न प्रकार हैं? ऐसा लगता है कि यह एक साधारण गेटर और सेटर को सामान्यीकृत करने का एक अच्छा तरीका होगा .. आप इसे रचनाकारों के साथ कर सकते हैं क्यों नियमित तरीकों से नहीं? उदाहरणतो जावा में आप अलग-अलग रिटर्न और पैरा के साथ डुप्लिकेट विधि नाम नहीं रख सकते हैं?

के लिए क्यों नहीं करने के लिए .. सक्षम हो

int getVal() { 

return int; 
} 

boolean getVal() { 

return true; 

} 

setVal(int a) { 
} 

और

setVal(boolean a) { 

} 
+0

[जावा? - क्यों नहीं वापसी प्रकार आधारित पद्धति से अधिक भार] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2744511/java-why-no-return-type-based-method-overloading) – nawfal

उत्तर

11

तो क्योंकि संकलक यह पता लगाने में असमर्थ हो जाएगा:

 
setVal(getVal()); 

यह bool या पूर्णांक संस्करण बुलाना चाहिए?

+0

अगर यह एक पैरामीटर तो यह setVal कि स्वीकार करता है का उपयोग करना चाहिए के रूप में एक बूलियन प्राप्त करता है और एक बूलियन – Ayrad

+0

जब एक निर्माता विभिन्न मापदंडों को स्वीकार करता है की तरह सेट लेकिन पर वापसी कर सकते हैं मूल्य वही नाम है – Ayrad

+4

लेकिन संकलक पहली जगह GetVal के बूल संस्करण का चयन कैसे करेगा? यह स्पष्ट रूप से दो समान मान्य विकल्प है। –

15

अगर मैं कहा जाता है आप क्या उम्मीद करेंगे:

getVal(); 

कोई वापसी vaue एकत्र किया जा रहा साथ ? आपके पास दो विकल्प हैं - या तो बूलियन या पूर्णांक संस्करण। चूंकि आप एकत्रित होने के लिए वापसी मूल्य को लागू नहीं कर सकते हैं, इसलिए संकलक निर्धारित नहीं कर सकता कि किस संस्करण को बुलाया जा सकता है।

आप विधि पैरामीटर पर अधिभार कर सकते हैं, लेकिन अकेले रिटर्न प्रकारों पर नहीं, क्योंकि यह संदिग्ध है (ऊपर दिखाया गया है)।

+0

आदर्श अगर यह एक बूलियन है कि यह उदाहरण के लिए .. कहता है .. अगर है (getVal == सच है) तो यह अन्यथा अगर यह पूर्णांक एक = getVal() यह बुलाना चाहिए getVal कि एक सच्चे रिटर्न बुलाना चाहिए .. एक जो एक int देता है। – Ayrad

+2

जैसा कि मैंने सचित्र है, तो आप नहीं कर सकते हैं * बल * इस –

3

विभिन्न रिटर्न प्रकार, नहीं। लेकिन विभिन्न पैरामीटर प्रकार/लंबाई, हां। इस तरह जावा है ... विनिर्देश कहते हैं कि। वे इसे सरल रखना चाहते थे।

+0

सी ++ के लिए भी लागू होता है। – Raze

6

पहली नज़र में ऐसा लगता है कि किसी को ऐसा करने की अनुमति नहीं दी जानी चाहिए, लेकिन हालांकि कोड के परिप्रेक्ष्य से इसके बारे में सोचें जिसे इस (इन) विधि को कैसे कॉल करना चाहिए, कैसे क्या यह पता चलेगा कि किस विधि का आह्वान करना है?

java.sun.com

जावा प्रोग्रामिंग भाषा से तरीकों अधिक भार का समर्थन करता है, और जावा अलग पद्धति हस्ताक्षरों के साथ तरीकों के बीच भेद कर सकते हैं। इसका मतलब है कि किसी वर्ग के भीतर विधियों का नाम समान हो सकता है यदि उनके पास अलग-अलग पैरामीटर सूचियां हों (इसके लिए कुछ योग्यताएं हैं जिन पर "इंटरफेस और विरासत" शीर्षक वाले पाठ में चर्चा की जाएगी)।

ओवरलोडेड विधियों को विधि में पारित तर्कों के प्रकार और प्रकार से अलग किया जाता है।

आप एक ही नाम और एक ही नंबर और तर्क का प्रकार, साथ एक से अधिक प्रणाली की घोषणा नहीं कर सकते क्योंकि संकलक उन्हें अपार टी नहीं बता सकता।

संकलक अलग-अलग तरीकों के दौरान रिटर्न प्रकार पर विचार नहीं करता है, इसलिए यदि आप एक अलग रिटर्न प्रकार के बावजूद एक ही हस्ताक्षर के साथ दो विधियों की घोषणा नहीं कर सकते हैं।

+0

वास्तव में एक कारण है: पुल विधियों का उपयोग कर कॉन्वर्सेंट रिटर्न प्रकार। – eljenso

+0

कंपाइलर नहीं कर सकता। लेकिन जेवीएम कर सकते हैं। दिलचस्प लेख के लिए जे –

5

जहाँ तक जावा वर्चुअल मशीन का संबंध है के रूप में, यह एक वर्ग में एक ही हस्ताक्षर लेकिन अलग वापसी प्रकार के साथ कई तरीकों की घोषणा करने के लिए संभव है।

केवल, जावा भाषा के रूप में जावा इसे प्रतिबंधित करता है।

0

आप अपने मामले में दो सेटर्स घोषित कर सकते हैं - इसे आजमाएं।

तरीके उनके नाम के संदर्भ में अद्वितीय होना चाहिए, और संख्या और उनके तर्क का प्रकार। वापसी प्रकार, साथ ही throws खंड, (के रूप में वे निर्दिष्ट नहीं कर रहे हैं, जो समझ में आता है जब आप यह आह्वान ) एक विधि अद्वितीय बनाने के मामले में शामिल नहीं होते।

4

सामान्यतया - कोई। लेकिन आप यह बहुत ज्यादा चाहते हैं - तो हाँ :)) चेक इस great article

+0

+2, -1 सोचने के लिए * डरावनी * लोगों के लिए वास्तव में ऐसा कर सकता है। :- पी –

+0

पूरी तरह से आपसे सहमत हैं। एक स्थिति जब यह * वास्तव में * आवश्यक होगी - विरासत कोड जहां सभी को फिर से लिखने से आसानी से नया हुक जोड़ना होगा। –

+0

यह एक महान खोज है! – Raze

0

जावा भाषा विशिष्टता के अनुसार (http://docs.oracle.com/javase/specs/jls/se5.0/html /classes.html#8.4.2):

यह एक संकलन समय त्रुटि एक कक्षा में ओवरराइड-बराबर हस्ताक्षर (नीचे वर्णित) के साथ दो तरीकों घोषित करने के लिए है। अगर वे एक ही नाम और तर्क प्रकार है

दो तरीकों में एक ही हस्ताक्षर है।

संबंधित मुद्दे

 संबंधित मुद्दे