दिलचस्प पोस्ट
फ़ंक्शन में एक सबफ़ंक्शन के साथ काम क्यों नहीं करता? पुस्तकालय लोड नहीं किया जा सकता है: reloc_library : 'रैंड' का पता नहीं लगा सकता "एक्स-यूए-संगत" सामग्री = "आईई = 9; IE = 8; IE = 7; IE = किनारा " मैं वास्तव में कभी नहीं समझा: POSIX क्या है? शॉर्टहैड http: // as // स्क्रिप्ट और लिंक टैग के लिए? इससे पहले किसी को भी इसका इस्तेमाल / देख सकते हैं? JavaScript का उपयोग करके किसी तत्व की सीएसएस संपत्ति पढ़ें दृश्य स्टूडियो में ग्रुप फाइलें सी Enum में अंतिम अल्पविराम क्या आवश्यक है? जावा हॅशमैप: कैसे मूल्य से कुंजी प्राप्त करने के लिए? ऑपरेटर == को सामान्य प्रकार के सी # में लागू नहीं किया जा सकता है? दो मानदंडों द्वारा एक पायथन सूची को छंटनी एमएस एक्सेस (जेट / एसीई) में तालिका-कम यूनियन क्वेरी कैसे जावास्क्रिप्ट का उपयोग कर html बटन को अक्षम करें? कैसे पता लगाने के लिए कि एक स्ट्रिंग पर यूटीएफ 8 डीकोड या एन्कोड करना है? कैसे foreach loops सी # में काम करते हैं?

क्यों जावा वर्गों कार्यान्वित इंटरफेस से एनोटेशन का उत्तराधिकार नहीं है?

मैं कुछ विधि कॉलों को रोकने के लिए Guice's AOP का उपयोग कर रहा हूं मेरा वर्ग एक इंटरफ़ेस लागू करता है और मैं इंटरफ़ेस विधियों को एनोटेट करना चाहता हूं ताकि गइज़ सही तरीकों का चयन कर सके। यहां तक ​​कि अगर एनोटेशन प्रकार की एनोटेशन एनोटेशन क्लास के साथ एनोटेट किया गया है, एनरोटेशन का वारिस नहीं है जैसा कि इनहेरिटेड के जावा डॉक में कहा गया है:

ध्यान दें कि यह मेटा-एनोटेशन केवल सुपरटेलेस से विरासत में लाने के लिए एनोटेशन का कारण बनता है; कार्यान्वित इंटरफेस पर एनोटेशन का कोई प्रभाव नहीं है।

इसका क्या कारण रह सकता है? सभी इंटरफेस जानने के लिए कि ऑब्जेक्ट का क्लास रनटाइम में कार्यान्वित करता है, ऐसा करना कठिन काम नहीं है, इसलिए इस निर्णय के पीछे एक अच्छा कारण होना चाहिए।

Solutions Collecting From Web of "क्यों जावा वर्गों कार्यान्वित इंटरफेस से एनोटेशन का उत्तराधिकार नहीं है?"

मैं कहूंगा कि अन्यथा एक बहु-विरासत समस्या होगी।

उदाहरण:

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface Baz { String value(); } public interface Foo{ @Baz("baz") void doStuff(); } public interface Bar{ @Baz("phleem") void doStuff(); } public class Flipp{ @Baz("flopp") public void doStuff(){} } public class MyClass extends Flipp implements Foo, Bar{} 

अगर मैं ऐसा करता हूं:

 MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value() 

क्या परिणाम होने जा रहा है? 'बज़', 'फ्लेम' या 'फ्लॉप'?


इस कारण से, इंटरफेस पर एनोटेशन शायद ही उपयोगी होते हैं।

Javadoc से @ इनहेरिटेड के लिए:

यह इंगित करता है कि एक एनोटेशन प्रकार स्वचालित रूप से विरासत में मिली है यदि एक इनहेरिटेड मेटा-एनोटेशन एनोटेशन प्रकार की घोषणा पर मौजूद है, और उपयोगकर्ता एक श्रेणी घोषणा पर एनोटेशन प्रकार पूछता है, और क्लास घोषणा इस प्रकार के लिए कोई एनोटेशन नहीं है, तो क्लास के सुपर क्लास को स्वचालित रूप से एनोटेशन प्रकार के लिए पूछताछ किया जाएगा। इस प्रकार के लिए एक एनोटेशन तब तक दोहराई जाएगी जब तक कि यह प्रकार पाया नहीं जाता है या क्लास पदानुक्रम (ऑब्जेक्ट) के शीर्ष पर पहुंच जाता है। यदि इस प्रकार के लिए कोई सुपर क्लास का कोई एनोटेशन नहीं है, तो क्वेरी यह संकेत देगी कि सवाल वाले वर्ग में ऐसी कोई टिप्पणी नहीं है ध्यान दें कि इस मेटा-एनोटेशन प्रकार का कोई प्रभाव नहीं है यदि एनोटेट किए गए प्रकार का उपयोग किसी कक्षा के अलावा किसी अन्य चीज के लिए किया जाता है। ध्यान दें कि यह मेटा-एनोटेशन केवल सुपरटेलेस से विरासत में लाने के लिए एनोटेशन का कारण बनता है; कार्यान्वित इंटरफेस पर एनोटेशन का कोई प्रभाव नहीं है।

दूसरी ओर, जेएसआर 305 वैलिएट्स कुछ प्रकार की विरासत देखने का काम करते हैं। यदि आपके पास वर्गों की श्रेणीबद्धता है:

 //Person.java @Nonnull public Integer getAge() {...} //Student.java (inherits from Person) @Min(5) public Integer getAge() {...} 

इसके बाद @Nonnull @Min(5) Student.getAge() पर प्रभावी मान्यताओं @Nonnull @Min(5) @Nonnull की कोई भी @Inherited -एनोटेशन नहीं है।