2016-07-19 39 views
5

मुझे एक कन्स्ट्रक्टर मिला है जो 4 पैरामीटर लेता है: String, Object, Object, MyEnumजब मैं उपयोग ढूंढता हूं क्लिक करता हूं तो Intellij कन्स्ट्रक्टर का चयन कैसे करता है?

public MyClass(String name, Object val1, Object val2, MyEnum cat) { 
// find in usage = 202 
    this.name = name; 
    this.val1 = val1; 
    this.val2 = val2; 
    this.cat = cat; 
} 

95% उपयोग मामलों में पिछले पैरामीटर null है, इसलिए मैं एक और निर्माता जो केवल 3 पैरामीटर लेता है और एक अशक्त के रूप में पिछले एक सेट बनाने के लिए करना चाहते हैं।

कुछ विचार मेरे मन में आया था लेकिन अंत में मैं निम्नलिखित समाधान के लिए एक कोशिश दे दी है: 202 खोजने उपयोग अभी भी -: - public MyClass(String name, Object val1, Object val2, Integer cat)

  1. बदलें पिछले पैरामीटर MyEnum से Integer को (संकलन त्रुटि कोई फर्क नहीं पड़ता)

  2. प्रकार वस्तु के अंतिम पैरामीटर के साथ नए निर्माता जोड़ें: public MyClass(String name, Object val1, Object val2, Object cat) और अब पहले निर्माता (Integer के साथ) 196 प्रयोगों और दूसरी है एक 6.

यह वही है जो मैं चाहता था (मुझे शून्य के अंतिम तत्व के साथ बिल्कुल 6 आमंत्रण मिल गए हैं) लेकिन इस व्यवहार का कारण क्या है? क्या इंटेलिज कुछ चेक करता है और यदि इनपुट प्रकार MyEnum है तो इसे Integer प्रकार के रूप में पारित नहीं किया जा सकता है, लेकिन शून्य दोनों को पास किया जा सकता है, तो पहले कन्स्ट्रक्टर के मामले में 6 कम परिणाम क्यों हैं?

जब मैं String करने के लिए Object से बदल (अब मैं String और Integer के साथ 2 कंस्ट्रक्टर्स है) दोनों मुझे 0 देना जब मैं उपयोग लगता है चलाते हैं।

इस व्यवहार की व्याख्या के लिए धन्यवाद।

+1

क्या आप जावा के [अधिभार के लिए नियम] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.9) के बारे में पूछ रहे हैं? या आप कुछ तरीकों का वर्णन करने की कोशिश कर रहे हैं कि आईडीईए में "उपयोग ढूंढें" जावा से वास्तव में मेल नहीं खा रहा है? –

+0

मैं केवल यह समझना चाहता हूं कि आईडीईए ने पोस्ट किए गए परिदृश्य में उपयोग का उपयोग कैसे किया है। – ruhungry

उत्तर

0

यह वास्तव में एक इंटेलिजे सवाल नहीं है बल्कि एक जावा कन्स्ट्रक्टर चेनिंग प्रश्न है।

अगर वहाँ एक उच्च मौका है बिल्ली रिक्त है आपको निम्न दो कंस्ट्रक्टर्स होना चाहिए:

public MyClass(String name, Object val1, Object val2) { 
    this(name, val1, val2, null) 
} 

public MyClass(String name, Object val1, Object val2, MyEnum cat) { 
    this.name = name; 
    this.val1 = val1; 
    this.val2 = val2; 
    this.cat = cat; 
} 
1

तुम दोनों myMethod(Integer a) और myMethod(Object a), है, तो myMethod(null) के लिए एक कॉल, पूर्णांक संस्करण फोन करेगा, क्योंकि यह है अधिक विशिष्ट। इसी प्रकार, यदि आपके पास myMethod(MyEnum a) और myMethod(Object a) था, तो एक नल तर्क पारित होने पर MyEnum संस्करण को कॉल किया जाएगा। (देखें this answer शून्य ओवरलोड के बारे में, जो section 15.12.2.5 of the Java Language Specification का संदर्भ देता है।) इसमें वास्तव में कोई फर्क नहीं पड़ता कि यह इंटीजर या मायनम पर आधारित है या नहीं; दोनों ऑब्जेक्ट से अधिक विशिष्ट हैं, इसलिए ओवरलोड लोड किया जा रहा है।

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

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

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