Java泛型 - 可否取出Map的泛型參數?

這兩天有一個小需求:java

  • 運行時取出Map對象實例的泛型參數。

Google事後,第一條就是StackOverflow的相關問題:如何取出Map的泛型參數code

在這作一下記錄,原文問題及回答都很是有趣清晰。對象

問題:

public Object[] convertTo(Map source, Object[] destination) {
    ...
}
是否有可能經過反射來獲取到Map的泛型參數?

回答1:

被採納的答案接口

對於任意的 Map<Key, Value>,要在 運行時獲取到它的 KeyValue類型是不可能的。這是由於 類型擦除
然而,能夠在 運行時經過 getClass()檢查map裏每一個對象的真實類型。再一次說明,這仍然不會告訴你 KeyValue的類型。(筆者注:考慮接口與實現的關係)

回答2:

未被採納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的代碼僅在特定狀況下有效。
相關文章
相關標籤/搜索