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的所有示例都没有转换,所以我必须做错了什么。
这有用,但出于好奇:为什么不第一行编译? getAnnotation方法根本不使用类的T,所以它不应该有什么区别? (它显然是!!) –
assylias
2012-02-24 15:25:12
我认为,当您使用原始类'Class'时,编译器会忘记类中的所有泛型,以便与pre-generics Java向后兼容。 – Jesper 2012-02-24 15:27:06
绝对有效。似乎很奇怪,但我想@Jesper是正确的,它是为了向后兼容。 – 2012-02-24 15:32:51