2012-02-24 21 views
20

Java 1.6.0_25 kullanıyorum.Class.getAnnotation() neden bir yayın yapmamı gerektiriyor?

Ben bir ek açıklama tanımlanmıştır:

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

Ve sonra ben getAnnotation kullandığınızda:

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

derleyici ve IDE ben sonucu döküm gerektiğini kabul ediyorum, ama getAnnotation Java bildirildi 1.5 belge şu şekilde:

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

Resource.class tür sınıf olduğundan beri Bu, cls.getAnnotation (Resource.class) türünün Kaynak türünü döndürmesi gerektiği anlamına gelir ve benim de yayınlamam gerekir.

GetAnnotation'u kullanarak bulduğum tüm örnekler bir döküm almıyor, bu yüzden yanlış bir şey yapmam gerekiyor.

cevap

24

cls'un türü nedir? Ham Class mi, yoksa Class<Something> mu?

Ham türü Class ise, yayınlama gereklidir. Class yerine en az Class<?> yaparsanız, artık oyuncuya ihtiyacınız olmaz.

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

Bu, ancak meraktan yoksun çalışır: Neden ilk satır derleme değil mi? GetAnnotation yöntemi, Sınıfının T'sini hiç kullanmaz, bu nedenle herhangi bir fark yaratmamalıdır? (tabii ki yapar!) – assylias

+1

Ben ham sınıf 'Class' kullandığınızda, derleyici pre-generics Java ile geriye dönük uyumluluk için sınıftaki tüm jenerikler unutur. – Jesper

+1

Kesinlikle işe yaradı. Garip görünüyor, ama sanırım @Jesper, geriye dönük uyumluluk için doğru. –

İlgili konular