2012-02-24 22 views
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)應該返回類型資源,我應該需要投。

我發現使用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方法根本不使用類的T,所以它不應該有什麼區別? (它顯然是!!) – assylias 2012-02-24 15:25:12

+1

我認爲,當您使用原始類'Class'時,編譯器會忘記類中的所有泛型,以便與pre-generics Java向後兼容。 – Jesper 2012-02-24 15:27:06

+1

絕對有效。似乎很奇怪,但我想@Jesper是正確的,它是爲了向後兼容。 – 2012-02-24 15:32:51

相關問題