找不到适合getAnnotation的方法(Class <cap#1>)

时间:2016-06-14 16:11:27

标签: java class generics annotations field

我正在编写一些简单的方法来获取注释类,字段或方法。第一个获取类级注释的方法工作正常。复制并粘贴它以创建一个新方法来获取字段级注释会导致编译错误:

error: no suitable method found for getAnnotation(Class<CAP#1>)

不确定对类对象的getAnnotation方法调用是如何工作正常的,但对Field对象调用相同的方法会导致此编译错误。

思想?

public class AnnotationTool {
    public static <T> T getAnnotation(Class c, Class<? extends T> annotation) {
        return (T)c.getAnnotation(annotation);
    }

    public static <T> T getAnnotation(Class c, String fieldName, Class<? extends T> annotation) {
        try {
            Field f = c.getDeclaredField(fieldName); 
            return (T)f.getAnnotation(annotation);   // compile error here??
        } catch (NoSuchFieldException nsfe) {
            throw new RuntimeException(nsfe);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

Field.getAnnotation期望一个类是注释的子类:

public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {

因此,在您的帮助方法中,您需要相应地限制类型参数:

public static <T extends Annotation> T getAnnotation(Class<?> c, String fieldName, Class<T> annotation) {

请注意,您的类级别助手方法也是如此。但是您使用了原始类型Class c,这阻止了编译器发出相同的错误。