为什么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); 

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

 public  A getAnnotation(Class annotationClass); 

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

我发现使用getAnnotation的所有示例都没有强制转换,所以我一定做错了。

cls的类型是什么? 是原始Class还是Class

如果它是原始类型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 cls3 = Example.class; Resource anno = cls3.getAnnotation(Resource.class); // OK