2011-04-27 9 views
21

मुझे कुछ कोड में एक स्थान मिला है जहां मैं null पर काम कर रहा हूं Object पर इसे एक विधि में पारित किया गया है।वस्तु को शून्य क्यों डाला?

ऐसा क्यों किया जाएगा?

मुझे this question के बारे में पता है जो ओवरलोडेड विधियों से संबंधित है, और कास्ट का उपयोग करके यह निर्धारित करने के लिए कि किस विधि को कॉल करना है।

लेकिन अगर कास्ट नहीं किया गया था, तो Object के रूप में टाइप किए गए पैरामीटर के साथ अधिभारित विधि नहीं होगी यदि विधि को शून्य तर्क के साथ बुलाया जाता है तो विधि के किसी अन्य मिलान संस्करण पर चुना जाएगा? तो कलाकार क्या हासिल करता है?

+0

संभावित डुप्लिकेट [क्यों नल कास्ट?] (Http://stackoverflow.com/questions/315846/why-null-cast) –

उत्तर

38

यदि कास्ट जहां प्रदर्शन नहीं किया गया है, तो सबसे विशिष्ट संस्करण चुना जाएगा।

nullString प्रकार या Object प्रकार का एक शून्य संदर्भ हो सकता है। तो यदि वे दो विधियां उपलब्ध हैं, तो String विधि कॉल की जाएगी।

आप Object साथ तरीकों है, तो IntegerऔरString तो बुला कि null (और कोई डाली) के साथ एक संकलन त्रुटि देना होगा क्योंकि Integer और String दोनों वैध और समान रूप से विशिष्ट (यानी कोई भी एक विशेषज्ञता है अन्य)। उस स्थिति में आप को null पर डालने के लिए निर्दिष्ट करने के लिए निर्दिष्ट करेंगे।

+0

हालांकि मैं आपके उत्तर से सहमत हूं लेकिन मेरा मानना ​​है कि पहला कथन सही ढंग से नहीं रखा गया है यानी कंपाइलर हमेशा एक से अधिक विधि लागू होने पर सबसे विशिष्ट मिलान का पता लगाने का प्रयास करता है, उदाहरण के लिए, यदि आप इंटीजर कहने के लिए शून्य डालते हैं और आपके पास ओवरलोडेड विधि है क्रमशः ऑब्जेक्ट प्रकार और संख्या प्रकार तर्क के साथ यह संख्या प्रकार (यानी सबसे विशिष्ट एक) के साथ एक को हल करेगा। 'String.valueOf (ऑब्जेक्ट ओ) 'के लिए – sactiw

-2

"लेकिन अगर डाली प्रदर्शन नहीं कर रहे थे, एक पैरामीटर वस्तु के रूप में आपके द्वारा लिखा गया साथ एक ओवरलोड विधि विधि के किसी भी अन्य मिलान संस्करण पर चुना जाएगा नहीं किया जा अगर विधि एक शून्य तर्क के साथ कहा जाता है?"

नहीं, क्योंकि 'शून्य' का कोई प्रकार नहीं है - आपको संकलन त्रुटि मिल जाएगी।

+4

गलत। यदि आप एक से अधिक "सबसे विशिष्ट" ओवरलोड हैं तो आप ** केवल ** संकलन त्रुटि प्राप्त करें। –

+0

मैं इसे मानते हुए ले रहा था कि उसके पास एक से अधिक विधि हैं, यह प्रश्न में एम्बेडेड है। – cbz

14

"Object विधि" सभी "लागू विधियों" के बीच हमेशा "कम से कम विशिष्ट" विधि है। यही कारण है कि यह संकलक द्वारा नहीं चुना जाएगा।

आप

String.valueOf(null); 

चलाते हैं तो संकलक दो "लागू तरीकों" के चुनाव है। आप वास्तव में अधिक विशिष्ट विधि

String.valueOf((char[]) null); 

जो तुम एक NullPointerException दे देंगे कॉल कर रहे हैं। आदेश अन्य विधि कॉल करने के लिए,

String.valueOf((Object) null); 

बारे में इस मामले में, आप केवल एक "लागू विधि" के साथ रहता है, आप एक अलग, अतिभारित विधि जा रहा है "और अधिक विशिष्ट" की समस्या नहीं है।

+0

+1 सभी संभावित मैचों में" कम से कम विशिष्ट "मैच है। हालांकि, यह भी उल्लेख करना होगा कि स्ट्रिंग के मामले में यदि कोई विशिष्ट कलाकार नहीं किया जाता है तो हमारे साथ छोड़ा गया "सबसे विशिष्ट" मैच 'String.valueOf (char [] c) है और इस प्रकार इसे कॉल किया जाता है। ** नोट: ** जावा कंपाइलर हमेशा "सबसे विशिष्ट" मैच वाले एक को अधिभारित तरीकों का समाधान करता है और यदि ऐसा करने में विफल रहता है तो यह 'विधि का संदर्भ अस्पष्टता' संकलन त्रुटि देगा। – sactiw

+0

@ सक्टिव: संकेत के लिए धन्यवाद। हां, मैंने 'char []' बनाम 'बाइट [] 'को गलत टाइप किया है ... –

0

हालांकि पिछले उत्तरों में पहले से ही बताया गया है कि यदि आप ऑब्जेक्ट बनाम नल डाले हैं तो क्या होता है यदि आप ऑब्जेक्ट में शून्य नहीं डालते हैं, लेकिन मैं अभी भी कुछ लापता अंक जोड़ना चाहता हूं।

तो जावा में, 'सरणी' ऑब्जेक्ट्स हैं जिसका अर्थ है कि उन्हें ऑब्जेक्ट प्रकार यानी असाइन किया जा सकता है।यदि आप new char[0].getClass().getSuperclass() करते हैं तो यह java.lang.Object देता है और इसलिए जब शून्य को स्पष्ट रूप से कास्ट नहीं किया जाता है तो valueOf(char[])valueOf(Object) से अधिक लागू विधि के रूप में चुनता है।

हालांकि, यहाँ लापता हिस्सा आता है, वहाँ एक और अतिभारित विधि है कि एक इंटरफ़ेस प्रकार परम को स्वीकार किया गया था किया गया था (याद इंटरफ़ेस ऑब्जेक्ट वर्ग विस्तार नहीं तो वे भी सबसे विशिष्ट विधि चयन में अस्पष्टता के कारण) जैसे valueOf (CharSequence) तो इससे समय त्रुटि संकलित हो सकती है (यानी valueOf के संदर्भ अस्पष्ट है) क्योंकि तब संकलक सबसे अधिक लागू विधि नहीं चुन सकता था।

तो नीचे की रेखा कच्चे नल से गुजरने से बचने के तरीकों के रूप में तर्कों के तर्क के रूप में हमेशा उन्हें विधि के तरीके के रूप में हमेशा के रूप में डाली जाती है। :)

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