2012-02-24 24 views
20

मैं जावा 1.6.0_25 का उपयोग कर रहा हूं।क्लास.get एन्नोटेशन() को मुझे कास्ट करने की आवश्यकता क्यों है?

मैं एक एनोटेशन परिभाषित किया गया है:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Resource { 
    String value(); 
} 

और बाद में जब मैं getAnnotation का उपयोग करें:

Resource resource = (Resource)cls.getAnnotation(Resource.class); 

संकलक और आईडीई का मानना ​​है कि मैं परिणाम कास्ट करना होगा, लेकिन getAnnotation जावा में घोषित किया जाता है

public <A extends Annotation> A getAnnotation(Class<A> annotationClass); 

के बाद से Resource.class प्रकार कक्षा की है, यह लगता है: के रूप में 1.5 प्रलेखन मुझे इसका मतलब है कि cls.getAnnotation (Resource.class) प्रकार संसाधन वापस करना चाहिए, और मुझे कास्ट करने की आवश्यकता है।

प्राप्त करने के लिए मुझे मिले सभी उदाहरणों में एनाटेशन नहीं है, इसलिए मुझे कुछ गलत करना होगा।

उत्तर

24

cls का प्रकार क्या है? क्या यह कच्चे Class है या यह Class<Something> है?

यदि यह कच्चा प्रकार Class है, तो कलाकार आवश्यक है। यदि आप इसे Class के बजाय कम से कम Class<?> बनाते हैं, तो आपको अब कलाकारों की आवश्यकता नहीं होगी।

Class cls = Example.class; 

// Error: Type mismatch, cannot convert from Annotation to Resource 
Resource anno = cls.getAnnotation(Resource.class); 

Class<?> cls2 = Example.class; 
Resource anno = cls2.getAnnotation(Resource.class); // OK 

Class<Example> cls3 = Example.class; 
Resource anno = cls3.getAnnotation(Resource.class); // OK 
+1

यह काम करता है लेकिन जिज्ञासा से बाहर: पहली पंक्ति संकलित क्यों नहीं होती है? GetAnnotation विधि क्लास के टी का उपयोग नहीं करती है, इसलिए इससे कोई फर्क नहीं पड़ता है? (यह स्पष्ट रूप से करता है !!) – assylias

+1

मुझे लगता है कि जब आप कच्चे वर्ग 'कक्षा' का उपयोग करते हैं, तो संकलक प्री-जेनेरिक जावा के साथ पिछड़े संगतता के लिए कक्षा में सभी जेनेरिकों को भूल जाता है। – Jesper

+1

निश्चित रूप से काम किया। अजीब लगता है, लेकिन मुझे लगता है कि @ जेस्पर सही है कि यह पीछे की तरफ संगतता के लिए है। –

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