दिलचस्प पोस्ट
मैं पर्ल में एक प्रक्रिया को कैसे भूल सकता हूं और भूल सकता हूं? लॉगिन द्वारा अनुरोधित डेटाबेस "परीक्षण" नहीं खोल सकता लॉगिन विफल हुआ। उपयोगकर्ता 'xyz \ ASPNET' के लिए प्रवेश विफल Google मानचित्र एपीआई v3: सभी मार्करों को कैसे हटाएं? स्वयं के बीच अंतर और बस var जावा का अंतिम बनाम सी ++ संग्रहीत कार्यप्रणाली C #: MYSQL को कॉल करने के वैध उदाहरण के लिए पूछना PHP – सबसे अच्छा कैसे तय करना है कि मौजूदा आमंत्रण सीएलआई या वेब सर्वर से है? गतिशील रूप से जोड़ा गया सामग्री के लिए jQuery क्लिक ईवेंट जोड़ना C ++ पहचानकर्ता में अंडरस्कोर का उपयोग करने के बारे में नियम क्या हैं? Segue का उपयोग करके दृश्य नियंत्रकों के बीच डेटा पास करना सी # में वेरिएबल नामों में @ वर्ण का उपयोग / अर्थ क्या है? सी राज्य मशीन डिजाइन REGISTER_GLOBALS बहुत बुरा क्यों है? फ्लास्क दृश्य वापसी त्रुटि "फ़ंक्शन फ़ंक्शन ने कोई प्रतिक्रिया नहीं दी" वर्तमान निर्देशिका में सभी उपनिर्देशिका की सूची प्राप्त करना

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

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

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

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

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

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

उदाहरण:

@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 -एनोटेशन नहीं है।