gpt4 book ai didi

java - 为什么 java Class 对象在作为 Class 变量访问时与通过 .getClass() 方法访问时具有不同的 API/签名?

转载 作者:行者123 更新时间:2023-11-29 08:02:03 25 4
gpt4 key购买 nike

我看到 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信息。

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

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

关于java - 为什么 java Class 对象在作为 Class 变量访问时与通过 .getClass() 方法访问时具有不同的 API/签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com