2008-11-14 20 views
8

我有一段代碼可以工作,我想問一下這裏發生了什麼?Java類型

Class<?> normalFormClass = null; 

---添加---

通配符 「<?>」 是混淆了我的一部分。爲什麼會使用它而不是使用它(泛型)?

回答

12

這意味着它可以是任何類型的類。 ?是表示所有類型集合的通配符,或者「任何」。所以,你以後可以做

Integer normalForm = new Integer(); 
normalFormClass = normalForm.getClass(); 

String normalForm = new String(); 
normalFormClass = normalForm.getClass(); 

如果你不知道Java的泛型,讀http://java.sun.com/developer/technicalArticles/J2SE/generics/

至於爲什麼,我想可能是嚴格表達你的都是無處不在,你的代碼與老版本的Java不兼容,或者關閉一些觸發快樂的IDE。是的,

Class foo 

Class<?> foo 

是等價的。

+0

很好的例子!我仍然在學習Java的基礎知識,並一直在想這些括號中的代碼行。 – 2008-11-14 19:01:17

+0

謝謝是的......我知道泛型,但是?通配符是我想確保我完全理解的東西。 – 2008-11-14 19:02:02

+0

除非你不能像這樣創建一個新的類;)也許normalFormClass = obj.getClass(); – erickson 2008-11-14 20:54:08

0

我懷疑這是作業,因爲我從來沒有在一個講反思的課。

但是這是一個簡單的空分配。它什麼都不做。

2

班級或班級<?>運作良好。使用後者的一個原因是擺脫ide或編譯器在使用第一種形式時會拋出的一些警告。

4

另外,通用版本

Class<?> normalClass = null; 

相當於原始類型的版本差不多,

Class normalClass = null; 

的主要區別是,後者將與不的Java版本兼容支持泛型,如Java 1.4。

3

類<T>意味着從JDK 1.5開始,Class被類定義的類型泛化。考慮這一點的一種方式是Class是用於創建其類型實例的工廠。
具體而言,一個類<T>從Class.newInstance()方法創建類型T的實例。

從JDK 1.5開始,Java Language Spec建議您不要使用原始類型。因此,強烈建議在處理未知類型的類實例時,應將其稱爲「類<?>」,而不只是「類」。當然,如果你確實知道類型或邊界,你可能會發現指定它的一些好處。

0

類是可參數化類,因此你可以使用語法類,其中T爲一個類型。通過編寫Class,您聲明瞭一個可以是任何類型的Class對象(?是通配符)。類類型是包含關於類的元信息的類型。

通過使用Class來尊重這種做法(您知道Class是可參數化的),但通過指定一個泛型來引用泛型,這總是一種很好的做法,但您並沒有限制您的參數具有一個特定的類型。

參考有關泛型和通配符:http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

約Class對象和反射參考(Java語言的功能來反思自身):http://java.sun.com/developer/technicalArticles/ALT/Reflection/