केवल रिटर्न प्रकार को बदलकर किसी फ़ंक्शन को अधिभार देना क्यों संभव नहीं है? क्या यह जावा के भविष्य के संस्करण में बदल जाएगा?
वैसे, केवल संदर्भ के लिए, क्या यह C ++ में संभव है?
केवल रिटर्न प्रकार को बदलकर किसी फ़ंक्शन को अधिभार देना क्यों संभव नहीं है? क्या यह जावा के भविष्य के संस्करण में बदल जाएगा?
वैसे, केवल संदर्भ के लिए, क्या यह C ++ में संभव है?
जवाबों:
आप इसे जावा में नहीं कर सकते, और आप इसे C ++ में नहीं कर सकते। तर्क यह है कि संकलक के लिए अकेले वापसी मूल्य पर्याप्त नहीं है कि किस फ़ंक्शन को कॉल किया जाए:
public int foo() {...}
public float foo() {..}
...
foo(); // which one?
float
, यह नहीं है double
।
foo();
वापसी प्रकार के बिना अस्पष्ट होगा जरूरी नहीं कि इसे एक अधिभार के रूप में अस्वीकार कर दिया जाए। ऐसे तर्क हैं जो अस्पष्टता (जैसे foo(null);
) का कारण बन सकते हैं , लेकिन यह अधिभार को स्वाभाविक रूप से अमान्य नहीं बनाता है।
कारण यह है कि जावा में ओवरलोड केवल विभिन्न हस्ताक्षर वाले तरीकों के लिए अनुमत हैं ।
वापसी प्रकार विधि हस्ताक्षर का हिस्सा नहीं है, इसलिए इसका उपयोग ओवरलोड को अलग करने के लिए नहीं किया जा सकता है।
जावा ट्यूटोरियल से परिभाषित करने के तरीके देखें ।
calculateAnswer(double, int, double, double)
"। देखें कि रिटर्न प्रकार शामिल नहीं है, @konmik।
जावा 5.0 से पहले, जब आप एक विधि को ओवरराइड करते हैं, तो दोनों पैरामीटर और रिटर्न प्रकार बिल्कुल मेल खाना चाहिए। जावा 5.0 में, यह एक नई सुविधा का परिचय देता है जिसे सहसंयोजक वापसी प्रकार कहा जाता है। आप एक ही हस्ताक्षर के साथ एक विधि को ओवरराइड कर सकते हैं लेकिन लौटाए गए ऑब्जेक्ट का उपवर्ग लौटाते हैं। दूसरे शब्दों में, एक उपवर्ग में एक विधि एक वस्तु को लौटा सकती है जिसका प्रकार सुपरक्लास में उसी हस्ताक्षर के साथ विधि द्वारा लौटाए गए प्रकार का उपवर्ग है।
Overloaded
जावा में तरीकों के अलग-अलग रिटर्न प्रकार हो सकते हैं जो कि तर्क भी अलग हैं।
सैंपल कोड देखें।
public class B {
public String greet() {
return "Hello";
}
//This will work
public StringBuilder greet(String name) {
return new StringBuilder("Hello " + name);
}
//This will not work
//Error: Duplicate method greet() in type B
public StringBuilder greet() {
return new StringBuilder("Hello Tarzan");
}
}
किसी विधि को ओवरलोड करते समय रिटर्न प्रकार मायने नहीं रखता है। हमें केवल यह सुनिश्चित करने की आवश्यकता है कि कोई अस्पष्टता नहीं है!
एकमात्र तरीका जावा को पता चल सकता है कि कॉल करने की कौन सी विधि तर्क सूची के प्रकारों को अलग करती है। यदि कंपाइलर एक ही नाम और एक ही प्रकार के तर्क के साथ दो तरीकों की अनुमति देता है, तो यह निर्धारित करने का कोई तरीका नहीं होगा कि उसे किसको कॉल करना चाहिए।
कंपाइलर रिटर्न प्रकार पर विचार नहीं करता है जब अलग-अलग तरीके, इसलिए आप एक ही हस्ताक्षर के साथ दो तरीकों की घोषणा नहीं कर सकते हैं भले ही उनके पास एक अलग रिटर्न प्रकार हो।
यदि आप फ़ंक्शन निष्पादन के बारे में जानते हैं, तो आप जानते होंगे कि जब हम किसी फ़ंक्शन को परिभाषा भाग निष्पादित करते हैं और अंत में हमें रिटर्न स्टेटमेंट की आवश्यकता होती है, इसलिए हम कह सकते हैं कि फ़ंक्शन के संपूर्ण विक्षेपण के बाद वापसी होती है, इसलिए यदि दो या एक ही नाम के साथ और एक ही प्रकार के साथ अधिक कार्य और नहीं। तर्कों के बाद कॉल करने के समय कैसे संकलक को पता चलेगा कि किसको बुलाया जाना है, क्योंकि फ़ंक्शन का नाम और पैरामीटर समान हैं। सबसे पहले कॉल करने के समय सारा ध्यान तर्कों और फ़ंक्शन नाम पर होगा और अंतिम में फ़ंक्शन की परिभाषा पूरी होने के बाद हम रिटर्न स्टेटमेंट से निपटेंगे।
Compile Time Error Run Time Error से बेहतर है। यदि आप समान पैरामीटर वाले समान विधि की घोषणा करते हैं, तो जावा कंपाइलर कंपाइलर टाइम एरर को रेंडर करता है।
नहीं वास्तव में संभव नहीं है कि जिस तरह से आप केवल तर्कों या डेटा प्रकार के तर्कों के द्वारा अधिभार कर सकते हैं