注释'不兼容类型'编译器错误

时间:2012-04-17 14:39:45

标签: java annotations

出于好奇:我有以下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行的区别是什么?

1 个答案:

答案 0 :(得分:4)

这是原始类型的一个奇怪特征。当您使用泛型类型(Class<T>)作为原始类型(Class)时,其成员将被视为其删除。

JLS §4.8 Raw Types

  

未从其超类或超接口继承的原始类型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) 

并且因AnnotationPath的分配而导致错误。

为了防止它,您需要在其参数化形式中使用泛型类型。如果您不关心TClass<T>的实际值,请使用通配符:

void b(Class<?> z) {
    Path p = z.getAnnotation(Path.class); 
}