2009-06-17 121 views

回答

34

這是相同的所有通用的和原始類型:

Class   // An unknown class (raw type) 
Class<?>  // An unknown class (generic version) 
Class<String> // The String class 

在這種特殊情況下有ClassClass<?>之間沒有太大的實際差異,因爲它們都代表一個未知的類。根據現有的聲明,編譯器可以要求泛型類型而不是原始類型。

但:自Java 1.5以來,您應該儘可能使用通用表單。 Class<?>明確指出你的意思是「未知類」,Class<String> cleary指出你的意思是String類。原料Class可能意味着均爲

最後它對編譯器沒有什麼區別,但它使代碼的意圖更易於理解和維護。

+2

應該避免Class類儘可能... – 2009-06-17 13:53:41

10

javadoc

類型參數: T - 通過此Class對象建模的類的類型。例如,String.class的類型是Class<String>。如果正在建模的類未知,則使用Class<?>

不帶類型參數使用Class類似於使用任何通用類(MapList等),而不類型參數 - 無論它是一個預1.5遺留使用或它只是一個的代碼,不會段不關心未經檢查的類型轉換。

2

<?>表明您有意編寫不瞭解或關心您正在處理的類的Java 5級代碼。離開它使得它看起來像舊的代碼或由尚未學習泛型的人編寫的代碼。

1

「它看起來像舊的代碼或由尚未學習泛型的人編寫的代碼。」這是一個正確的說法。類(發音爲「未知類」),即類型匹配任何內容的類。由於顯而易見的原因,它被稱爲通配符類型。

例如:

public void drawAll(List<Shape> shapes) { 
    for (Shape s: shapes) { 
     s.draw(this); 
    } 
} 

類型的規則說,drawAll()只能呼籲的正是Shape列表:它不能,例如,被稱爲上,也就是說,一個List<Circle>。這是不幸的,因爲所有的方法都是從列表中讀取形狀,所以它可以在List<Circle>上調用。

我們真正想要的是該方法接受任何形狀的列表。

public void drawAll (List <? extends Shape> shapes) { 

} 

閱讀更多:http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

相關問題