Подтвердить что ты не робот

Почему 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, не имеют приведения, поэтому я должен делать что-то неправильно.

4b9b3361

Ответ 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