20
私はJava 1.6.0_25を使用しています。なぜClass.getAnnotation()はキャストを要求しますか?
私は注釈が定義されている:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
String value();
}
以降、私はgetAnnotationを使用する場合:
Resource resource = (Resource)cls.getAnnotation(Resource.class);
コンパイラとIDEは私が結果をキャストしなければならないことを同意するが、getAnnotationはJavaで宣言されています1.5文書の内容:
public <A extends Annotation> A getAnnotation(Class<A> annotationClass);
Resource.classはClassタイプなので、これは、cls.getAnnotation(Resource.class)がResource型を返さなければならないことを意味し、キャストする必要があります。
私がgetAnnotationを使って見つけたすべての例はキャストを持っていないので、何か間違っている必要があります。
これはうまくいきますが、最初の行がコンパイルされないのはなぜですか? getAnnotationメソッドはTのTを全く使用しないので、何の違いもありません。 (それは明らかです!!) – assylias
生のクラス 'Class'を使用すると、コンパイラは、ジェネリック以前のJavaとの下位互換性のために、クラス内のすべてのジェネリックについて忘れてしまいます。 – Jesper
間違いなく働いた。奇妙だと思われますが、@Jesperはそれが後方互換性のために正しいと思います。 –