क्या हमें @ इंटरफ़ेस को लागू करने की विधि लागू करनी चाहिए?


432

एक विधि है कि एक अंतरफलक विधि लागू किया जाना चाहिए के साथ एनोटेट किया जाना चाहिए @Override?

एनोटेशन का javadocOverride कहता है:

इंगित करता है कि एक विधि घोषणा एक सुपरक्लास में एक विधि घोषणा को ओवरराइड करने का इरादा है। यदि इस एनोटेशन प्रकार के साथ एक विधि एनोटेट की जाती है, लेकिन एक सुपरक्लास विधि को ओवरराइड नहीं करता है, तो त्रुटि संदेश उत्पन्न करने के लिए कंपाइलर्स की आवश्यकता होती है।

मुझे नहीं लगता कि एक इंटरफ़ेस तकनीकी रूप से एक सुपरक्लास है। या यह है?

Question Elaboration


5
वाह यह सवाल कम हो सकता है, लेकिन यह वह सवाल है जिसकी मुझे ज़रूरत थी। धन्यवाद
Dan Rosenstark

1
मुझे @ ऑवरराइड लेख के लिए प्रतिस्थापन नहीं मिल सकता है (हाल ही में ओरेकल ने पुराने सूर्य ब्लॉगों को स्थानांतरित किया)। क्या आप जानते हैं कि इसे कैसे खोजना है?
छिपकली

4
हमारे पास अब (2015) द्वारा @ इम्प्लीमेंट (एन) एनोटेशन होना चाहिए। इससे चीजें स्पष्ट होंगी!
एलेक्स

3
अब तक (2015) क्या हमें java 8 के साथ @ ऑवरराइड का उपयोग करना चाहिए?
लोरेंजो साइकोटो

जवाबों:


305

जब भी संभव हो आप @ ऑवरराइड का उपयोग करें। यह साधारण गलतियों को होने से रोकता है। उदाहरण:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

यह संकलन नहीं करता है क्योंकि यह ठीक से ओवरराइड नहीं करता है public boolean equals(Object obj)

वही उन तरीकों के लिए जाएगा जो एक इंटरफ़ेस को लागू करते हैं ( केवल 1.6 और इसके बाद के संस्करण ) या सुपर क्लास की विधि को ओवरराइड करते हैं।


150
ध्यान दें कि आप जावा 5 में इंटरफ़ेस को लागू करने की विधि में @ ऑवरराइड एनोटेशन नहीं जोड़ सकते हैं - यह एक त्रुटि उत्पन्न करता है। जावा 6 में इसकी अनुमति है
बिल माइकेल

17
उम, नहीं, यह नहीं है। वास्तव में, एक इंटरफ़ेस को लागू करने वाले तरीकों को भरने पर @ ऑटो-आवेषण को ग्रहण करें।
jjnguy

14
-1 जब तक उत्तर में इंटरफ़ेस विधि लागू करने के संबंध में जावा 1.5 से 1.6 तक के विभिन्न व्यवहार के बारे में उल्लेख शामिल है। सिर्फ इसलिए कि मैंने इसे लोगों के लिए एक भ्रामक पहलू माना है और यह वास्तव में एक उल्लेख का गुण है।
ग्रंडलेफ़्लेक

2
यदि ग्रहण की शिकायत है तो ur jdk को> 1.5 में अपग्रेड करें और संकलक अनुपालन स्तर को 1.6 या 1.7 में बदलें। ऐसा करने के लिए आप ur project-> properties-> Java कंपाइलर पर राइट क्लिक करें और एक का चयन करें जो 1.5 से अधिक हो।
रोज

1
क्या कोई ऐसे उदाहरण के बारे में सोच सकता है जो वास्तव में उत्तर को सही ठहराता है (आधार विधियों को ओवरराइड करने के बजाय इंटरफेस को लागू करना)? मेरे लिए एक बड़ा प्लस यह है कि यह एक पाठकों की उम्मीदों को निर्धारित करता है कि किसी विशेष विधि का उपयोग कैसे और किस तरीके से किया जा सकता है।
जो ली-मोयेट

103

मेरा मानना ​​है कि javac व्यवहार बदल गया है - 1.5 के साथ यह एनोटेशन निषिद्ध है, 1.6 के साथ यह नहीं है। एनोटेशन एक अतिरिक्त संकलन-समय जाँच प्रदान करता है, इसलिए यदि आप 1.6 का उपयोग कर रहे हैं तो मैं इसके लिए जाऊंगा।


1
अतिरिक्त जांच क्या है?
माइकल कार्मन

17
अगर आप किसी भी इंटरफ़ेस को हटा चुके हैं तो @Michael नोटिस कर सकते हैं
सांग्युन ली

68

@Overrideयदि यह उपलब्ध है तो आपको हमेशा तरीकों की व्याख्या करनी चाहिए ।

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

equals(Object)बनाम equals(YourObject)उदाहरण बिंदु में एक मानक मामला है, लेकिन एक ही तर्क इंटरफेस कार्यान्वयन के लिए बनाया जा सकता है।

मुझे लगता है कि इंटरफेस के तरीकों को लागू करने के लिए एनोटेट करना अनिवार्य नहीं है कारण यह है कि JDK 5 ने इसे एक संकलन त्रुटि के रूप में चिह्नित किया। यदि JDK 6 ने इस एनोटेशन को अनिवार्य कर दिया, तो यह पश्चगामी संगतता को तोड़ देगा।

मैं एक ग्रहण उपयोगकर्ता नहीं हूं, लेकिन अन्य IDEs (IntelliJ) में, @Overrideएनोटेशन केवल तभी जोड़ा जाता है जब इंटरफ़ेस विधियों को कार्यान्वित किया जाता है यदि परियोजना को JDK 6+ प्रोजेक्ट के रूप में सेट किया जाता है। मैं कल्पना करूंगा कि ग्रहण समान है।

हालाँकि, मैंने इस उपयोग के लिए एक अलग एनोटेशन देखना पसंद किया होगा, शायद एक @Implementsएनोटेशन।



11

@Overrideयदि आप इंटरफ़ेस (इसकी संकलन त्रुटि) में घोषित विधि को लागू कर रहे हैं, तो JDK 5.0 आपको एनोटेशन का उपयोग करने की अनुमति नहीं देता है , लेकिन JDK 6.0 इसे अनुमति देता है। तो हो सकता है कि आप अपनी आवश्यकता के अनुसार अपनी परियोजना वरीयता को कॉन्फ़िगर कर सकें।


4

यदि कोई ठोस वर्ग एक अमूर्त विधि को ओवरराइड नहीं कर रहा है @Override, तो कार्यान्वयन के लिए उपयोग करना एक खुला मामला है क्योंकि कंपाइलर हमेशा किसी भी अनपेक्षित तरीकों से आपको चेतावनी देगा। इन मामलों में, एक तर्क दिया जा सकता है कि यह पठनीयता से अलग हो जाता है - यह आपके कोड पर पढ़ने के लिए अधिक चीजें हैं और, कुछ हद तक, इसे कहा जाता है @Overrideऔर नहीं @Implement


3

अपने स्वयं के वर्गों से विरासत में मिली अपनी विधियों को ओवरराइड करने से आम तौर पर एक विचारधारा का उपयोग करके रिफैक्टरिंग पर ब्रेक नहीं लगेगा। लेकिन अगर आप लाइब्रेरी से विरासत में मिली विधि को ओवरराइड करते हैं तो इसे इस्तेमाल करने की सलाह दी जाती है। यदि आप नहीं करते हैं, तो आपको अक्सर बाद के पुस्तकालय परिवर्तन पर कोई त्रुटि नहीं मिलेगी, लेकिन एक अच्छी तरह से छिपा हुआ बग।


3

यह जेडीके के साथ कोई समस्या नहीं है। एक्लिप्स हेलिओस में, यह लागू इंटरफ़ेस विधियों के लिए @ ऑवरराइड एनोटेशन की अनुमति देता है, जो भी JDK 5 या 6. ग्रहण गैलीलियो के लिए, @ ऑवरराइड एनोटेशन की अनुमति नहीं है, जो भी JKK 5 या 6 है।


2

मेरे लिए, कई बार यही एकमात्र कारण है कि कुछ कोड को संकलन के लिए जावा 6 की आवश्यकता होती है। यकीन नहीं होता अगर यह इसके लायक है।


2

Java8 में javadoc को पढ़कर, आप इंटरफ़ेस ओवरराइड की घोषणा पर निम्नलिखित पा सकते हैं:

यदि इस एनोटेशन प्रकार के साथ एक विधि को एनोटेट किया जाता है, तो निम्न स्थितियों में से कम से कम एक होने पर त्रुटि संदेश उत्पन्न करने के लिए कंपाइलर की आवश्यकता होती है:

  • यह विधि किसी सुपरटाइप में घोषित विधि को ओवरराइड या कार्यान्वित करती है।
  • विधि में एक हस्ताक्षर है जो {@linkplain ऑब्जेक्ट} में घोषित किसी भी सार्वजनिक विधि के मुकाबले ओवरराइड-समतुल्य है।

तो, कम से कम java8 में, आपको एक इंटरफ़ेस विधि के कार्यान्वयन पर @Override का उपयोग करना चाहिए।


1

@Overrideजब आप किसी इंटरफ़ेस को लागू करने वाले वर्ग के निर्माण के दौरान इसे "अनइम्प्लीमेंटेड तरीके उत्पन्न करने" के लिए कहेंगे तो एक्लिप्स स्वयं एनोटेशन जोड़ देगा ।


1

इसमें शामिल समस्या @Overrideयह है कि इससे आपको लगता है कि आप इस super.theOverridenMethod()पद्धति को कॉल करना भूल गए हैं , जो बहुत भ्रामक है । यह क्रिस्टल-स्पष्ट होना चाहिए। शायद जावा को @Interfaceयहां इस्तेमाल करने की पेशकश करनी चाहिए । ओह ठीक है, फिर भी एक और आधा-पिछड़ा जावा ख़ासियत ...


3
सुपर को कॉल करना, जब कोई इंटरफ़ेस लागू नहीं करता है, तो कुछ ऐसा नहीं है जो आपको हमेशा करना चाहिए या करना चाहिए। कभी-कभी, आप कार्यक्षमता जोड़ रहे हैं - इसलिए आप इसे कहते हैं। दूसरी बार, आप कार्यक्षमता को बदल रहे हैं, इसलिए आप इसे कॉल नहीं करते हैं। एक एपीआई लेखक को यह दस्तावेज करना चाहिए कि वह आंतरिक कार्यक्षमता पर निर्भर है या नहीं और इस बारे में एक दस्तावेज अनुबंध बनाएं कि कक्षा को कैसे ठीक से बढ़ाया जा सकता है।
lilbyrdie

1

जावा 6 और बाद के संस्करणों में, आप @Overrideएक इंटरफ़ेस को लागू करने की विधि के लिए उपयोग कर सकते हैं ।

लेकिन, मुझे लगता है कि यह समझ में नहीं आता है: ओवरराइड का मतलब है कि आप सुपर क्लास में एक विधि बना रहे हैं, और आप इसे सब क्लास में लागू कर रहे हैं।

यदि आप एक इंटरफ़ेस लागू कर रहे हैं, तो मुझे लगता है कि हमें उपयोग करना चाहिए @Implementया कुछ और, लेकिन नहीं @Override


0

इंटरफ़ेस के लिए, @ ऑवरराइड का उपयोग करके संकलित त्रुटि हुई। इसलिए, मुझे इसे हटाना पड़ा।

त्रुटि संदेश " The method getAllProducts() of type InMemoryProductRepository must override a superclass method" गया।

यह भी " One quick fix available: Remove @Override annotation." पढ़ा

यह ग्रहण 4.6.3, JDK 1.8.0_144 पर था।


0

यदि वह वर्ग जो कार्यान्वित कर रहा है interfaceवह एक abstractवर्ग है, @Overrideयह सुनिश्चित करने के लिए उपयोगी है कि कार्यान्वयन एक interfaceविधि के लिए है; @Overrideएक abstractवर्ग के बिना सिर्फ ठीक संकलन होगा भले ही कार्यान्वयन विधि हस्ताक्षर में घोषित विधि से मेल नहीं खाती हो interface; बेमेल interfaceविधि के रूप में लागू किया जाएगा। जावा डॉक्टर @Zhao द्वारा उद्धृत

यह विधि किसी सुपरटाइप में घोषित विधि को ओवरराइड या कार्यान्वित करती है

abstractसुपर क्लास का स्पष्ट रूप से जिक्र है ; a interfaceको सुपरटाइप नहीं कहा जा सकता है। इसलिए, ठोस वर्गों में विधि के कार्यान्वयन के @Overrideलिए अनावश्यक और समझदार नहीं है interface

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