为什么Class.getAnnotation()要求我进行演员表?

Tho*_*ews 27 java

我正在使用Java 1.6.0_25.

我有一个定义的注释:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
    String value();
}
Run Code Online (Sandbox Code Playgroud)

后来当我使用getAnnotation时:

Resource resource = (Resource)cls.getAnnotation(Resource.class);
Run Code Online (Sandbox Code Playgroud)

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

public <A extends Annotation> A getAnnotation(Class<A> annotationClass);
Run Code Online (Sandbox Code Playgroud)

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

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

Jes*_*per 32

是什么类型的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
Run Code Online (Sandbox Code Playgroud)

  • 我认为当你使用原始类`Class`时,编译器会忘记类中的所有泛型,以便与pre-generics Java向后兼容. (4认同)