2012-02-24 4 views
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을 사용하여 찾은 모든 예제에는 캐스트가 없으므로 잘못된 결과가 발생합니다.

답변

24

cls 유형은 무엇입니까? 원시 Class이거나 Class<Something>입니까?

원시 유형이 Class 인 경우 전송이 필요합니다. Class 대신 적어도 Class<?> 인 경우 더 이상 전송할 필요가 없습니다.

Class cls = Example.class; 

// Error: Type mismatch, cannot convert from Annotation to Resource 
Resource anno = cls.getAnnotation(Resource.class); 

Class<?> cls2 = Example.class; 
Resource anno = cls2.getAnnotation(Resource.class); // OK 

Class<Example> cls3 = Example.class; 
Resource anno = cls3.getAnnotation(Resource.class); // OK 
+1

이 있지만 호기심 작동 : 왜 첫 번째 줄은 컴파일되지 않습니다? getAnnotation 메서드는 TT를 사용하지 않으므로 아무런 차이가 없어야합니다. (분명히 !!) – assylias

+1

원시 클래스'Class'를 사용할 때 컴파일러는 사전 제네릭 Java와의 하위 호환성을 위해 클래스의 모든 제네릭을 잊어 버렸다고 생각합니다. – Jesper

+1

확실히 작동했습니다. 이상하게 보이지만 @Jesper는 그것이 하위 호환성을위한 것이라고 생각합니다. –

관련 문제