2012-02-24 24 views
20

我正在使用Java 1.6.0_25。为什么Class.getAnnotation()要求我进行转换?

我有一个注释中定义:

@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)应该返回类型资源,我应该需要投。

我发现使用getAnnotation的所有示例都没有转换,所以我必须做错了什么。

回答

24

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 
+1

这有用,但出于好奇:为什么不第一行编译? getAnnotation方法根本不使用类的T,所以它不应该有什么区别? (它显然是!!) – assylias 2012-02-24 15:25:12

+1

我认为,当您使用原始类'Class'时,编译器会忘记类中的所有泛型,以便与pre-generics Java向后兼容。 – Jesper 2012-02-24 15:27:06

+1

绝对有效。似乎很奇怪,但我想@Jesper是正确的,它是为了向后兼容。 – 2012-02-24 15:32:51

相关问题