2014-04-03 8 views
5

यदि मैं byte से int बदलता हूं तो मुझे एक कंपाइलर त्रुटि मिलती है। क्या आप समस्या की व्याख्या कर सकते हैं?जब मैं एक ही नाम और पैरामीटर प्रकार के साथ दो विधियों का प्रयास करता हूं तो मुझे संकलन त्रुटि क्यों मिलती है?

public class A { 
    protected int xy(int x) { return 0; } 
} 

class B extends A { 
    protected long xy(int x) { return 0; } //this gives compilor error 
    //protected long xy(byte x) { return 0; } // this works fine 
} 
+2

क्योंकि 'एक्सी' का विधि हस्ताक्षर 'बीसीई' जैसा ही है: समान नाम, पैरामीटर की एक ही मात्रा और समान प्रकार के पैरामीटर। –

+0

पाठ में पोस्ट किए गए आपके तरीके बिल्कुल ठीक हैं क्योंकि उनके पास ** अलग ** पैरामीटर प्रकार हैं। 'int' ** ** नहीं है 'बाइट' –

+0

@GermannAllington: यदि आप केवल शीर्षक और कोड पढ़ते हैं, तो यह थोड़ा उलझन में है, लेकिन * प्रश्न * की उद्घाटन रेखा यह स्पष्ट करती है: *" fi change बाइट से int मुझे एक कंपाइलर त्रुटि मिलती है। "* –

उत्तर

6

तो मैं int को byte बदल मैं एक संकलक त्रुटि मिलती है।

public class A { 
    protected int xy(int x) { return 0; } 
} 

class B extends A { 
    protected long xy(int x) { return 0; } 
} 

... और xy तरीकों में फर्क सिर्फ इतना है उनकी वापसी प्रकार है:

आप ऐसा कर, तो आप इस किया है। तरीकों को पूरी तरह से उनके रिटर्न प्रकारों से अलग नहीं किया जा सकता है, जिस तरह जावा को परिभाषित किया गया है। इस पर विचार करें:

myInstance.xy(1); 

कौन सा xy कॉल करना चाहिए? long xy(int x) या int xy(int x)?

अपने लक्ष्य ओवरराइडxyB में करने के लिए है, तो आप आदेश A#xy मिलान करने के लिए अपनी वापसी प्रकार int बनाने की जरूरत है।

2

कक्षा में एक ही हस्ताक्षर के साथ आपके पास दो विधियां नहीं हो सकती हैं, हालांकि विधियों को एक ही विरासत के पेड़ में अलग-अलग वर्गों में अलग-अलग रखा जाता है। यानी बेस क्लास और उप वर्ग

नोट: बस वापसी प्रकार संकलक तरीकों में अंतर को समझ नहीं सकते हैं। वापसी प्रकार विधि हस्ताक्षर में शामिल है

1

ऐसा इसलिए है क्योंकि यदि आप बाइट को int में बदलते हैं तो आपके पास आधार और उप वर्ग (समान विधि नाम और पैरामीटर प्रकार) में समान हस्ताक्षर के साथ विधि होगी और इसलिए वापसी प्रकार साथ ही साथ होना चाहिए। क्योंकि यह नहीं है (int और long) यह आपको त्रुटि देगा

1

आप केवल पैरामीटर और नामों के तरीकों को अलग कर सकते हैं।

 both methods are in same class B 

    b.xy(byte x) or b.xy(int x) is called for input xy(0) or xy(1) 
0

क्योंकि जब आप int में byte बदलने उदाहरण है, जिसमें विधि नहीं जानता है कि कौन सी विधि का मतलब है कहता है। एक या पुराना अधिलेखित?

Thats क्यों एक ही हस्ताक्षर (विधि का नाम, पैरामीटर के प्रकार और पैरामीटर की मात्रा) रखने की अनुमति नहीं है। एक सूचना के रूप में: वापसी का प्रकार हस्ताक्षर का हिस्सा नहीं है।

1

Overiding विधि एक प्रकार है कि प्रकार ओवरराइड विधि द्वारा दिया

2

आप एक ही नाम और इनपुट पैरामीटर के साथ दो तरीकों लिखने की कोशिश कर रहे हैं के लिए प्रतिस्थापित किया जा सकता लौटना चाहिए, यह संभव नहीं है।

निम्नलिखित दो तरीकों में देखो:

float met(){ 
    return 4.5; 
} 

double met(){ 
    return 5.4; 
} 

हम इस लाइन लिखते थे तो

int x = (int)met(); 

क्या विधि के नाम से जाना चाहते हैं?

निर्णय लेना संभव नहीं है, इसलिए इस स्थिति की अनुमति नहीं है।

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

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