2014-02-14 26 views
18

我碰到這樣的代碼:理解類<?>

public class RestfulAdage extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
    Set<Class<?>> set = new HashSet<Class<?>>(); 
    set.add(Adages.class); 
    return set; 
    } 
} 

我不明白Class<?>手段。

+0

我的意思是類 user3134565

+0

檢查http://stackoverflow.com/questions/290982/java-class-type – Yuan

回答

13

Class<?>是指一類未知的類型。該符號使用unbounded generic,它對可添加到集合中的類的類型沒有限制。例如,以下是行不通的

Set<Class<String>> set = new HashSet<Class<String>>(); 
set.add(Adages.class); // type not allowed 
+0

的實例,但如果這是真的,那麼爲什麼會失敗:set.add(「hello」)< - 我認爲它可以採取任何類型? – user3134565

+0

只能加null?這有什麼好處呢? – user3134565

+1

@ user3134565 - 「hello」是字符串實例,不是類實例。你可以放入'String.class'而不是字符串實例。你也可以把''你好。「.getClass()' – Avi

5

它指的是gererics。我建議你閱讀一下。基本上,你只知道在運行時使用什麼類型的對象。例如,類可以是整數,字符串或甚YourDefinedClassType
這裏讀http://java.sun.com/developer/technicalArticles/J2SE/generics/

+0

那麼,這是否意味着它可以採用任何類型的對象,如字符串,整數,雙精度等等? – user3134565

+1

set.add(「dd」)失敗,並且只有null ...爲什麼是 – user3134565

+0

@ user3134565閱讀泛型,而不僅僅是人們告訴你的!你無法學習簡單的方法。你嘗試添加一個對象的實例,你需要一個類 – diazazar

5

來源:(?)Wildcards

在通用代碼,問號,稱爲通配符,表示一個未知類型。通配符可用於多種情況:作爲參數,字段或局部變量的類型;有時作爲返回類型(儘管更好的編程實踐更具體)。通配符永遠不會用作泛型方法調用,泛型類實例創建或超類型的類型參數。

檢查鏈接,你會發現更多詳盡的文檔,示例等

7

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

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

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

參考關於類對象和反射的(用於內省自身的Java語言的特徵):(?)http://java.sun.com/developer/technicalArticles/ALT/Reflection/

7

在通用代碼,問號,稱爲通配符表示未知類型。通配符可用於多種情況:作爲參數,字段或局部變量的類型;有時作爲返回類型(儘管更好的編程實踐更具體)。通配符永遠不會用作泛型方法調用,泛型類實例創建或超類型的類型參數。

以下部分將更詳細地討論通配符,包括上限制通配符,下位限制通配符和通配符捕獲。

瞭解更多信息click here

+2

您能否向我解釋更多plz – Maythux

+0

以獲取更多信息:http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html – Danyal

+0

welcome mate :)。 – Danyal

4

假設您有一組屬於不同類型的,你有以及不同類的實例。因此,如果你想檢查這些實例是否是instanceof這些類中的一個,則可以遍歷這些集合並完成這項工作。而對於這種工作,你最好使用一個完全無限制集合:

public boolean checkClasses(Set<Class<?>> typeLessClassSet, Set instances){ 

    while(typeLessClassSet.hasNext()){ 
     Class c = typeLessClassSet.next(); 
     while(instances.hasNext()){ 
      Object o = instances.next(); 
      if(o instanceof c) 
      return true; 
     } 
    } 
     return false;  
} 
相關問題