为什么是课堂。getAnnotation()需要我执行强制转换?[英] Why is Class.getAnnotation() requiring me to do a cast?

问题描述

我使用的是 Java 1.6.0_25.

我定义了一个注释:

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

后来当我使用 getAnnotation 时:

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

编译器和 IDE 同意我必须转换结果,但 getAnnotation 在 Java 1.5 文档中声明为:

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

由于 Resource.class 是 Class 类型,在我看来这意味着 cls.getAnnotation(Resource.class) 应该返回 Resource 类型,我应该需要转换.

我使用 getAnnotation 找到的所有示例都没有强制转换,所以我一定做错了什么.

推荐答案

cls的类型是什么?是原始的 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

本文地址:https://www.itbaoku.cn/post/978699.html