2012-04-17 41 views
2

出於好奇的:我已followind SSCCE註釋 '不兼容的類型' 編譯器錯誤

import javax.ws.rs.Path; 

    @Path("/") 
     public class T { 

     void a() { 

      Path p = getClass().getAnnotation(Path.class); //1 

      Class z = getClass(); 
      p = z.getAnnotation(Path.class); //2 
     } 
} 

編譯器給出以下錯誤消息:

T.java:12: incompatible types 
found : java.lang.annotation.Annotation 
required: javax.ws.rs.Path 
     p = z.getAnnotation(Path.class); 
Note: T.java uses unchecked or unsafe operations. 

是什麼線的差// 1和// 2 ?

回答

3

這是原始類型的一個奇怪的特徵。當您使用泛型類型(Class<T>)作爲原始類型(Class)時,其成員被視爲其刪除對象。

JLS §4.8 Raw Types

的類型構造函數(§8.8),實例方法(§8.8,第9.4節),或者非靜態場的(§8.3)原始C型的M個是不繼承自其超類或超接口的類型是在對應於C的通用聲明中刪除其類型。

實際上,使用原始類型會禁用其成員聲明中所有與泛型有關的東西。

Class<T>你的情況的方法聲明爲

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

變成它的擦除

public Annotation getAnnotation(Class annotationClass) 

和你造成的Annotation分配Path錯誤。

爲了防止它,你需要使用它的參數化形式的泛型類型。如果您不在乎中T的實際值,請使用通配符:

void b(Class<?> z) { 
    Path p = z.getAnnotation(Path.class); 
} 
相關問題