मैंने आज देखा कि ऑटो-मुक्केबाजी कभी-कभी विधि अधिभार रिज़ॉल्यूशन में अस्पष्टता का कारण बन सकती है।ऑटोबॉक्सिंग जावा में अस्पष्ट कुछ कॉल क्यों करता है?
public class Test {
static void f(Object a, boolean b) {}
static void f(Object a, Object b) {}
static void m(int a, boolean b) { f(a,b); }
}
जब संकलित है, यह निम्न त्रुटि का कारण बनता है: सबसे सरल उदाहरण यह प्रतीत होता है
Test.java:5: reference to f is ambiguous, both method
f(java.lang.Object,boolean) in Test and method
f(java.lang.Object,java.lang.Object) in Test match
static void m(int a, boolean b) { f(a, b); }
^
इस त्रुटि को ठीक कर तुच्छ है:
static void m(int a, boolean b) { f((Object)a, b); }
: बस स्पष्ट ऑटो मुक्केबाजी का उपयोग
जो अपेक्षित रूप से पहले अधिभार को सही ढंग से कॉल करता है।
तो ओवरलोड रिज़ॉल्यूशन क्यों विफल हुआ? संकलक ऑटो-बॉक्स को पहला तर्क क्यों नहीं मिला, और सामान्य रूप से दूसरे तर्क को स्वीकार क्यों किया? मुझे ऑटो-मुक्केबाजी का स्पष्ट रूप से अनुरोध क्यों करना पड़ा?
धन्यवाद @eljenso। यह संकलक के मुद्दे को स्पष्ट करता है, लेकिन फिर यह मुझे आश्चर्यचकित करता है कि दूसरे चरण को क्यों परिभाषित किया गया है। क्या इसे "मुक्केबाजी/अनबॉक्सिंग रूपांतरणों की कम से कम संभव संख्या" के साथ संशोधित नहीं किया जा सकता है? –
उत्कृष्ट जवाब! –
ठीक है, धन्यवाद @eljenso! मैं मानता हूं कि, आपके उदाहरण में, कॉल संदिग्ध है। मुझे लगता है कि दो अधिभारों में मुक्केबाजी रूपांतरणों की समान संख्या होगी, इसलिए कॉल वास्तव में संदिग्ध है। लेकिन (जेएलएस के बावजूद), मुझे अपना उदाहरण अस्पष्ट नहीं दिख रहा है। तुम क्या सोचते हो? –