2012-02-24 18 views
20

Sto usando Java 1.6.0_25.Perché Class.getAnnotation() richiede che esegua un cast?

Ho un'annotazione definita:

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

E più tardi quando uso getAnnotation:

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

il compilatore e IDE sono d'accordo che devo lanciare il risultato, ma getAnnotation è dichiarata nel Java 1.5 documentazione come:

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

Poiché Resource.class è di tipo Classe, sembra me questo significa che cls.getAnnotation (Resource.class) dovrebbe restituire il tipo Resource, e dovrei avere bisogno di trasmettere.

Tutti gli esempi che ho trovato usando getAnnotation non hanno un cast, quindi devo fare qualcosa di sbagliato.

risposta

24

Qual è il tipo di cls? È crudo Class o è Class<Something>?

Se è il tipo grezzo Class, il cast è necessario. Se lo rendi almeno Class<?> anziché Class, non avrai più bisogno del cast.

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

Questo funziona, ma per curiosità: perché la prima linea non si compila? Il metodo getAnnotation non usa affatto la T della Classe quindi non dovrebbe fare alcuna differenza? (ovviamente lo fa !!) – assylias

+1

Penso che quando si utilizza la classe raw 'Class', il compilatore dimentichi tutti i generici della classe per compatibilità con le versioni precedenti di Java generico. – Jesper

+1

Ha funzionato sicuramente. Sembra strano, ma immagino che @Jesper abbia ragione che sia compatibile con le versioni precedenti. –

Problemi correlati