Почему Class.getAnnotation() требует, чтобы я сделал бросок?
Я использую Java 1.6.0_25.
У меня есть аннотация:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
String value();
}
И позже, когда я использую getAnnotation:
Resource resource = (Resource)cls.getAnnotation(Resource.class);
компилятор и среда ID согласны с тем, что я должен привести результат, но getAnnotation объявлен в документации Java 1.5 как:
public <A extends Annotation> A getAnnotation(Class<A> annotationClass);
Так как Resource.class имеет тип Class, мне кажется, что это означает, что cls.getAnnotation(Resource.class) должен возвращать тип Resource, и мне нужно будет использовать.
Все примеры, которые я нашел с помощью метода getAnnotation, не имеют приведения, поэтому я должен делать что-то неправильно.
Ответы
Ответ 1
Каков тип cls
? Является ли оно raw 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