2012-02-24 10 views
20

Estoy usando Java 1.6.0_25.¿Por qué Class.getAnnotation() me exige hacer un reparto?

tengo una anotación definida:

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

Y más tarde cuando uso getAnnotation:

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

el compilador e IDE están de acuerdo en que debía emitir el resultado, pero getAnnotation se declara en el Java 1.5 documentación como:

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

Dado que Resource.class es de tipo Clase, parece que me dice que esto significa que cls.getAnnotation (Resource.class) debería devolver el tipo Resource, y debería tener que enviarlo.

Todos los ejemplos que he encontrado usando getAnnotation no tienen un molde, por lo tanto, debo estar haciendo algo mal.

Respuesta

24

¿Cuál es el tipo de cls? ¿Es crudo Class o es Class<Something>?

Si es el tipo sin procesar Class, entonces el yeso es necesario. Si lo hace al menos Class<?> en lugar de Class, ya no necesitará el modelo.

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

Esto funciona pero por curiosidad: ¿por qué no compila la primera línea? El método getAnnotation no usa el T de la clase , por lo que no debería hacer ninguna diferencia. (¡Obviamente lo hace!) – assylias

+1

Creo que cuando usas la clase raw 'Class', el compilador olvida todos los genéricos de la clase para compatibilidad con versiones anteriores de Java genérico. – Jesper

+1

Definitivamente trabajado. Parece extraño, pero creo que @Jesper tiene razón en que es compatible con versiones anteriores. –

Cuestiones relacionadas