क्या जावा में किसी विधि के हस्ताक्षर में उसका रिटर्न प्रकार शामिल है?


102

क्या जावा वर्ग / इंटरफ़ेस में विधि हस्ताक्षर में उसका रिटर्न प्रकार शामिल है?

उदाहरण:

क्या जावा उन दो तरीकों के बीच का अंतर जानता है:

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}

या क्या यह केवल विधि नाम और मापदंडों की सूची है जो मायने रखती है?


7
वैसे, जावा 6 में जेनेरिक की हैंडलिंग में एक बग था जो आपको दोनों तरीकों की अनुमति देता है, क्योंकि जेवीएम हस्ताक्षर में रिटर्न प्रकार का उपयोग करता है और उन्हें चुनिंदा रूप से कॉल करता है। यह जावा 7 में तय किया गया था। vanillajava.blogspot.co.uk/2011/02/…
पीटर लॉरी

जवाबों:


146

Oracle डॉक्स से उद्धरण :

परिभाषा: विधि घोषणा के दो घटकों में विधि हस्ताक्षर शामिल हैं- विधि का नाम और पैरामीटर प्रकार।

यहां छवि विवरण दर्ज करें

चूंकि इस उदाहरण को शामिल करने के लिए प्रश्न को संपादित किया गया था:

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}

नहीं, संकलक को अंतर नहीं पता होगा, क्योंकि उनके हस्ताक्षर: myMethod(int param)समान हैं। दूसरी पंक्ति:

    public char myMethod(int param) {}

आपको त्रुटि देगा: विधि पहले से ही कक्षा में परिभाषित है , जो उपरोक्त कथन की पुष्टि करता है।


तो आपका मतलब है कि हम कक्षा में एक ही विधि नाम के दो तरीके नहीं रख सकते हैं, विभिन्न रिटर्न प्रकारों के साथ समान पैरामीटर?
कसुन सियामबलपिटिया

6
@KasunSiyambalapitiya हम नहीं कर सकते। कंपाइलर को कैसे पता चलेगा कि इस तरह से परिदृश्य में कॉल करने के कौन से तरीके हैं foo.bar(baz);?
कोलयूनया

@Jops, अगर हमारे पास थ्रो कीवर्ड है तो क्या होगा? क्या यह हस्ताक्षर से भी संबंधित है?
अकिला अमरसिंघे

19

जावा में वर्ग विधि हस्ताक्षर में रिटर्न प्रकार शामिल है?

जावा में, यह नहीं है, लेकिन इस JVM में यह स्पष्ट भ्रम पैदा कर सकता है।

क्या जावा में इंटरफ़ेस विधि हस्ताक्षर में रिटर्न प्रकार शामिल है?

वर्ग विधियों के लिए भी यही है।

या केवल विधि नाम और मापदंडों की सूची?

जावा के लिए विधि का नाम और पैरामीटर प्रकार। उदाहरण के लिए, पैरामीटर एनोटेशन और नाम मायने नहीं रखते।


1
आपका क्या मतलब है "जावा में यह नहीं है लेकिन जेवीएम में यह है।" आप जेवीएम में कैसे विस्तृत कर सकते हैं?
तरुण मगंती

3
@TarunMaganti JVM में विधि हस्ताक्षर में वापसी प्रकार शामिल है। जावा एक भाषा के रूप में नहीं है।
पीटर लॉरी

3
@xyz यह कुछ ऐसा है जिसे आप बाइट कोड को पढ़कर देख सकते हैं लेकिन जावा कोड को नहीं। कोई भी बाइट कोड यह दिखाता है।
पीटर लॉरी

8

बायटेकोड स्तर पर, "वापसी प्रकार" विधि हस्ताक्षर का हिस्सा है। इस पर विचार करो

public class Test1  {
    public Test1 clone() throws CloneNotSupportedException {
        return (Test1) super.clone();
    }
}

bytecode में 2 क्लोन () विधियाँ हैं

public clone()LTest1; throws java/lang/CloneNotSupportedException 

public clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 

वे केवल रिटर्न प्रकार से भिन्न होते हैं।


1
यह भ्रामक है क्योंकि उदाहरण विधि का अर्थ पहले पैरामीटर के रूप में उदाहरण है। एक बार सोच सकते हैं कि om (a) वास्तव में m (o, a) है। जैसे कि क्लोन के मामले में, क्या फर्क पड़ता है वह तर्क नहीं रिटर्न प्रकार है।
हूई ले


7

जावा लैंग्वेज स्पेस कहता है

यदि उनके नाम और तर्क प्रकार समान हैं, तो दो विधियों में समान हस्ताक्षर हैं।

इस प्रकार नहीं, रिटर्न प्रकार विधि हस्ताक्षर का हिस्सा नहीं है।


6

जेएवीए और कई अन्य भाषाओं में, आप रिटर्न मान को रखने के लिए चर के बिना एक विधि कह सकते हैं। यदि रिटर्न प्रकार एक विधि हस्ताक्षर का हिस्सा है, तो यह जानने का कोई तरीका नहीं है कि चर होल्डिंग रिटर्न मान को निर्दिष्ट किए बिना कॉल करते समय किस पद्धति को बुलाया जाएगा।


4

भाई, जावा में, हम उनके नाम और उनके मापदंडों द्वारा कॉल करने के तरीकों का उपयोग करते हैं, केवल उन्हें हमारे कोड में उपयोग करने के लिए, जैसे

मायमैथोड (20, 40)

इसलिए, JAVA केवल इसी संबंधित घोषणा (नाम + परम) में मिलते-जुलते सामान की खोज करता है, यही कारण है कि विधि हस्ताक्षर में केवल विधि का नाम और पैरामीटर शामिल हैं। :)



3

नहीं, जावा में विधि हस्ताक्षर में वापसी प्रकार शामिल नहीं है, लेकिन घोषणा करता है।

public             String         getString(String myString)

^access modifier   ^return type   ^name    ^parameter type and name

नीचे प्रतिक्रिया के आधार पर संपादित :)


1
जेएलएस का कहना है कि यह नहीं है। यह "समान नाम और तर्क प्रकार" है। पहुँच संशोधक और पैरामीटर नाम या तो विधि हस्ताक्षर का हिस्सा नहीं है।
पीटर लॉरी

अगर यह एक प्रश्न है कि यह ठीक है, लेकिन अगर मैं एक प्रोग्राम लिख रहा हूँ, मैं सार्वजनिक नहीं लिख रहा हूँ getString (), मैं सार्वजनिक स्ट्रिंग लिख रहा हूँ getString ()
Jeff Hawthorne

1
एक्सेस संशोधक, रिटर्न टाइप और थ्रो टाइप (एस) हस्ताक्षर का हिस्सा नहीं हैं, यही वजह है कि आपके पास String method( String s )और Double method( String s )उसी वर्ग में, उदाहरण के लिए नहीं हो सकता है।
रे स्टोजोनिक

2
शायद आप के method signatureसाथ भ्रमित कर रहे हैंmethod declaration
पीटर लॉरी

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


1

AspectJ (org.aspectj.lang.reflect.MethodSignature) का उपयोग करते हुए, इसमें रिटर्न प्रकार होता है


1

METHOD SIGNATURE RETURN TYPE को शामिल करता है।

जब डुप्लिकेट की जांच करनी होती है, तो कंपाइलर इसे अनदेखा कर देता है। जावा के लिए केवल दो प्रकार के हस्ताक्षर के साथ रिटर्न प्रकार से भिन्न होना अवैध है।

उसकी कोशिश करो:

public class Called {
    public String aMethod() {
        return "";
    }
}

public class Caller {
    public static void main(String[] main) {
        aMethod();
    }
    public static void aMethod() {
        Called x = new Called();
        x.aMethod();
    }
}

प्रोजेक्ट बनाएँ, बिन डायरेक्टरी पर जाएँ, Caller.cass को कहीं कॉपी करें । फिर कॉल की गई विधि बदलें:

public int aMethod() {
    return 0;
}

प्रोजेक्ट बनाएँ, आप देखेंगे कि Called.class और Caller.class दोनों के पास एक नया टाइमस्टैम्प है। ऊपर Caller.class को बदलें और प्रोजेक्ट चलाएँ। आपके पास एक अपवाद होगा:

java.lang.NoSuchMethodError: it.prova.Called.aMethod()Ljava/lang/String;

0

विधि हस्ताक्षर केवल विधि का नाम और पैरामीटर है। लेकिन मुझे विश्वास है कि आपका उदाहरण एक त्रुटि उत्पन्न करेगा यदि वे एक ही कक्षा में हों। आप बस इसे किसी भी विचार पर परख सकते हैं और देख सकते हैं कि संकलक एक त्रुटि फेंक देगा


0

यदि आप ग्रहण पर बताए गए कोड को चलाने का प्रयास करते हैं, तो आपके पास एक उत्तर होगा कि जावा कंपाइलर जावा तत्वों के बीच अंतर करने के लिए किन तत्वों को देखता है:

class Foo {
    public int  myMethod(int param) {
        return param;}
    public char *myMethod*(int param) { //this line throws an error 
        return param;
    }
}

त्रुटि फेंक दी गई है: प्रकार Foo में myMethod (int) डुप्लिकेट विधि।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.