为什么`Class`和`Class <! - ? - >`的实例在不应该这样的情况下有不同的行为?

时间:2011-11-01 17:31:04

标签: java compiler-construction behavior

我发现:

当我使用Class<?>声明变量时,getAnnotation充当:

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

,但当我使用Class声明变量时,getAnnotation充当:

public Annotation getAnnotation(Annotation annotationClass)

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


例如:我可以编译((Class<?>)clazz).getAnnotation(Human.class).age(),但无法编译((Class)clazz).getAnnotation(Human.class).age(),其中clazzClass个实例,而Human是注释界面,具有age方法。

1 个答案:

答案 0 :(得分:2)

您的问题很不清楚,但我怀疑您正在遇到原始类型。


JLS — 4.8 Raw Types

  

原始类型定义为:

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

JLS — 4.6 Type Erasure

  

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


所以实际上这个方法:

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

被删除了:

public Annotation getAnnotation(Class annotationClass)

这就是为什么你可以拨打getAnnotation,但返回类型不是Human,它只是Annotation