2011-11-15 50 views
1
HashMap<String, Boolean> myMap = new HashMap<String, Boolean>(); 
System.out.println(func1(myMap)); //should print "HashMap<String, Boolean>" 

我想知道是否有這樣的功能。該函數應該接受一個對象並返回對象的確切類型。它應該與所有的集合一起工作。如何在運行時確定通用對象的聲明類型?

+0

退房這個職位http://stackoverflow.com/questions/1942644/get-generic-type-of- java-util-list –

+0

可能重複的[如何確定泛型類的類?](http://stackoverflow.com/questions/182636/how-to-determine-the-class-of-a-generic-類型) –

回答

2

泛型信息在運行時被刪除。 println在運行時運行。在運行時,地圖只是一個HashMap。

2

不幸的是,沒有。
您可以發現它是一個使用反射的HashMap,但由於類型擦除,您將無法找到類型參數。

Wikipedia

泛型在編譯時的類型正確性檢查。泛型類型信息然後在稱爲類型擦除的進程中被刪除。例如,List<Integer>將被轉換爲非泛型類型List,其中可以包含任意對象。編譯時檢查可以確保生成的代碼是類型正確的。

作爲類型擦除的結果,類型參數不能在運行時確定。

0

由於類型擦除,這是完全不可能的。在運行時,對象的類型參數將被刪除,並且只會在使用它們的位置存在。字段和方法的類型參數可以通過反射來檢索,如果它們是具體的。

0

也許可以利用一個招,如果地圖至少有一個入口 如下

Map<String, Boolean> map = new HashMap<String, Boolean>(); 
    System.out.println(map.getClass().getName()); 
    Set set = map.entrySet(); 
    for (Object object : set) { 
     Map.Entry e = (Entry) object; 
     System.out.println(e.getKey().getClass()); 
     System.out.println(e.getValue().getClass()); 
    }