我看到Class实例具有不同的签名,至少在getAnnotation方法方面比较了Class对象和<some-object>.getClass()对象。

以下代码显示了一个示例案例。

@Bar("hello")
public class Foo {

    public static void main(String[] args) {

        Foo foo=new Foo();
        Bar bar1,bar2,bar3;

        Class clazz=foo.getClass();

        //This compiles and work (as expected)
        bar1=foo.getClass().getAnnotation(Bar.class);

        //This does not compile!
        bar2=clazz.getAnnotation(Bar.class);

        //This one copiles and work!
        bar3=(Bar) clazz.getAnnotation(Bar.class);

    }
}

@Retention(RetentionPolicy.RUNTIME)
@interface Bar {
    String value();
}


注意:整个示例是我编辑器中的复制和粘贴。

--------修改以更好地显示场景

我忘了在示例中说明“代码”并不像外部库那样意识到Foo的存在:

class SomeExternalLibrary{
    public static void someMethod(Class clazz){
        Bar bar2,bar3;

        bar2=clazz.getAnnotation(Bar.class);

        //This one copiles and work!
        bar3=(Bar) clazz.getAnnotation(Bar.class);
    }
}


使用此外部库的代码将如下所示:

SomeExternalLibrary.someMethod(Foo.class);


抱歉,我还没有意识到我的情况:-)

最佳答案

这个问题是关于泛型的。

编译错误的原因是您没有在clazz变量中包含类信息。

将代码更改为此将解决问题:

Class<Foo> clazz = foo.getClass();

10-07 19:34
查看更多