20
자바 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는 자바 선언 1.5 설명서는 다음과 같습니다.
public <A extends Annotation> A getAnnotation(Class<A> annotationClass);
Resource.class는 Class 유형이므로 cls.getAnnotation (Resource.class)이 Resource 유형을 반환해야하므로 캐스팅해야합니다.
getAnnotation을 사용하여 찾은 모든 예제에는 캐스트가 없으므로 잘못된 결과가 발생합니다.
이 있지만 호기심 작동 : 왜 첫 번째 줄은 컴파일되지 않습니다? getAnnotation 메서드는 TT를 사용하지 않으므로 아무런 차이가 없어야합니다. (분명히 !!) – assylias
원시 클래스'Class'를 사용할 때 컴파일러는 사전 제네릭 Java와의 하위 호환성을 위해 클래스의 모든 제네릭을 잊어 버렸다고 생각합니다. – Jesper
확실히 작동했습니다. 이상하게 보이지만 @Jesper는 그것이 하위 호환성을위한 것이라고 생각합니다. –