這兩天有一個小需求:java
運行時
取出Map對象實例
的泛型參數。Google事後,第一條就是StackOverflow的相關問題:如何取出Map的泛型參數code
在這作一下記錄,原文問題及回答都很是有趣清晰。對象
public Object[] convertTo(Map source, Object[] destination) { ... }
是否有可能經過反射來獲取到Map的泛型參數?
被採納的答案接口
對於任意的Map<Key, Value>
,要在運行時
獲取到它的Key
和Value
類型是不可能的。這是由於類型擦除
。
然而,能夠在運行時
經過getClass()
檢查map裏每一個對象的真實類型。再一次說明,這仍然不會告訴你Key
和Value
的類型。(筆者注:考慮接口與實現的關係)
未被採納get
你能夠輕鬆地經過反射獲取到泛型參數。
private Map<String, Integer> genericTestMap = new HashMap<String, Integer>(); public static void main(String[] args) { try { Field testMap = Test.class.getDeclaredField("genericTestMap"); testMap.setAccessible(true); ParameterizedType type = (ParameterizedType) testMap.getGenericType(); Type key = type.getActualTypeArguments()[0]; System.out.println("Key: " + key); Type value = type.getActualTypeArguments()[1]; System.out.println("Value: " + value); } catch (Exception e) { e.printStackTrace(); } }
回答2貼出的代碼很是有效,可以完整地取出Map<Key, Value>
的泛型參數。
有人質疑爲什麼回答2沒有被採納,因而有人解釋道:io
被採納的回答1纔是正確的。回答2只是抽取了Field字段中的類型聲明。這與在運行時獲取對象實例的泛型參數
是不同的操做。尤爲題主的代碼中的Map
並無帶任何泛型參數,這種狀況甚至沒法從參數聲明
中獲取泛型。因此回答2的代碼僅在特定狀況下有效。