出于好奇:我有以下SSCCE
import javax.ws.rs.Path;
@Path("/")
public class T {
void a() {
Path p = getClass().getAnnotation(Path.class); //1
Class z = getClass();
p = z.getAnnotation(Path.class); //2
}
}
编译器提供以下错误消息:
T.java:12: incompatible types
found : java.lang.annotation.Annotation
required: javax.ws.rs.Path
p = z.getAnnotation(Path.class);
Note: T.java uses unchecked or unsafe operations.
第// 1行和第2行的区别是什么?
答案 0 :(得分:4)
这是原始类型的一个奇怪特征。当您使用泛型类型(Class<T>
)作为原始类型(Class
)时,其成员将被视为其删除。
未从其超类或超接口继承的原始类型C的构造函数(第8.8节),实例方法(第8.8节,第9.4节)或非静态字段(第8.3节)M的类型是擦除在与C.对应的通用声明中的类型。
实际上,使用raw类型会禁用其成员声明中所有与泛型相关的内容。
在你的案例Class<T>
声明为
public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
变成了它的删除
public Annotation getAnnotation(Class annotationClass)
并且因Annotation
到Path
的分配而导致错误。
为了防止它,您需要在其参数化形式中使用泛型类型。如果您不关心T
中Class<T>
的实际值,请使用通配符:
void b(Class<?> z) {
Path p = z.getAnnotation(Path.class);
}