HashMap<String, Boolean> myMap = new HashMap<String, Boolean>();
System.out.println(func1(myMap)); //should print "HashMap<String, Boolean>"
我想知道是否有這樣的功能。該函數應該接受一個對象並返回對象的確切類型。它應該與所有的集合一起工作。如何在運行時確定通用對象的聲明類型?
HashMap<String, Boolean> myMap = new HashMap<String, Boolean>();
System.out.println(func1(myMap)); //should print "HashMap<String, Boolean>"
我想知道是否有這樣的功能。該函數應該接受一個對象並返回對象的確切類型。它應該與所有的集合一起工作。如何在運行時確定通用對象的聲明類型?
泛型信息在運行時被刪除。 println
在運行時運行。在運行時,地圖只是一個HashMap。
這是不可能的,這些信息在運行時不可用。 Java中有一種「類型擦除」。 http://download.oracle.com/javase/1,5.0/docs/guide/language/generics.html
感謝菅直人,這有幫助 – josh
不幸的是,沒有。
您可以發現它是一個使用反射的HashMap,但由於類型擦除,您將無法找到類型參數。
泛型在編譯時的類型正確性檢查。泛型類型信息然後在稱爲類型擦除的進程中被刪除。例如,
List<Integer>
將被轉換爲非泛型類型List
,其中可以包含任意對象。編譯時檢查可以確保生成的代碼是類型正確的。作爲類型擦除的結果,類型參數不能在運行時確定。
由於類型擦除,這是完全不可能的。在運行時,對象的類型參數將被刪除,並且只會在使用它們的位置存在。字段和方法的類型參數可以通過反射來檢索,如果它們是具體的。
也許可以利用一個招,如果地圖至少有一個入口 如下
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());
}
退房這個職位http://stackoverflow.com/questions/1942644/get-generic-type-of- java-util-list –
可能重複的[如何確定泛型類的類?](http://stackoverflow.com/questions/182636/how-to-determine-the-class-of-a-generic-類型) –