为什么“Class”和“Class”的实例具有不同的行为,而它不应该如此?

发布于 2024-12-13 04:19:58 字数 666 浏览 1 评论 0 原文

我发现:

当我使用 Class 声明变量时, getAnnotation 的作用为:

public <A extends Annotation> A getAnnotation(Class<A> annotationClass)

,但是当我' m 使用 Class 声明变量, getAnnotation 充当:

public Annotation getAnnotation(Annotation annotationClass)

,所以我无法编译使用传递的注释类特定方法的代码。


例如:我可以编译((Class)clazz).getAnnotation(Human.class).age(),但无法编译((Class)clazz ).getAnnotation(Human.class).age(),其中 clazz 是某个 Class 实例,Human 是注释接口,有年龄方法。

I've found that:

When I'm using Class<?> to declare variable, getAnnotation acts as:

public <A extends Annotation> A getAnnotation(Class<A> annotationClass)

, but when I'm using Class to declare variable, getAnnotation acts as:

public Annotation getAnnotation(Annotation annotationClass)

, so I couldn't compile code, that uses passed annotation class specific methods.


e.g.: I could compile((Class<?>)clazz).getAnnotation(Human.class).age(), but couldn't compile ((Class)clazz).getAnnotation(Human.class).age(), where clazz is some Class instance, and Human is annotation interface, that have age method.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

兔小萌 2024-12-20 04:19:58

你的问题很不清楚,但我怀疑你遇到了原始类型。


JLS — 4.8 原始类型

原始类型定义为:

  • 使用的泛型类型声明的名称,不带任何附带的实际类型参数。
  • 原始类型 R 的任何非静态类型成员,且不是从 R 的超类或超接口继承的。

JLS — 4.6 类型擦除

类型擦除是从类型(可能包括参数化类型和类型变量)到类型(永远不是参数化类型或类型变量)的映射。


所以实际上这个方法:

public <A extends Annotation> A getAnnotation(Class<A> annotationClass)

被删除为:

public Annotation getAnnotation(Class annotationClass)

这就是为什么你可以调用 getAnnotation,但返回类型不会是 Human,它只是 注释

Your question is very unclear, but I suspect you're running into a raw type.


JLS — 4.8 Raw Types:

A raw type is define to be either:

  • The name of a generic type declaration used without any accompanying actual type parameters.
  • Any non-static type member of a raw type R that is not inherited from a superclass or superinterface of R.

JLS — 4.6 Type Erasure:

Type erasure is a mapping from types (possibly including parameterized types and type variables) to types (that are never parameterized types or type variables).


So it's actually that this method:

public <A extends Annotation> A getAnnotation(Class<A> annotationClass)

is erased to this:

public Annotation getAnnotation(Class annotationClass)

That's why you can call getAnnotation, but the return type won't be Human, it'll just be Annotation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文