我看到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();