获取java.util.Map参数的泛型类型

时间:2011-05-27 06:50:58

标签: java generics reflection map

public Object[] convertTo(Map source, Object[] destination) {
    ...
}

是否有可能通过Reflection找出我的Map参数的泛型类型(键/值)?

5 个答案:

答案 0 :(得分:14)

我知道这个问题已经过时了,但最好的答案是错误的 您可以通过反射轻松获得通用类型。这是一个例子:

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();
    }
}

这将获得输出:
Key: class java.lang.String
Value: class java.lang.Integer

答案 1 :(得分:9)

给定Map<Key,Value>,无法在运行时找出KeyValue。这是由于type erasure(另请参阅Wikipedia)。

但是,可以检查地图中包含的每个对象(键或值),并调用它们的getClass()方法。这将告诉您该对象的运行时类型 。请注意,这仍然不会告诉您有关编译类型类型KeyValue的任何信息。

答案 2 :(得分:1)

您可以通过获取每个元素来检查源对象中的条目,并在每个元素的键/值对象上调用getClass。当然,如果地图在源头没有通用化,那么就不能保证其中的所有键/值都是相同的类型。

答案 3 :(得分:1)

您无法在运行时从地图中获取值类型,但也许您可以从destination数组中获取它(只要它不是null。)

public <V> V[] convertTo(Map<?,V> source, V[] destination) {
    return source.values().toArray(destination);
}

答案 4 :(得分:1)

通过这种方式,您可以获得地图的键和值的类型

public class Demo 
{
    public static void main(String[] args) 
    {
        Map map = new HashMap<String, Long>();
        map.put("1$", new Long(10));
        map.put("2$", new Long(20));
        Set<?> set = map.entrySet();
        Iterator<?> iterator = set.iterator();
        String valueClassType="";
        while (iterator.hasNext()) 
        {
            Map.Entry entry = (Entry) iterator.next();
            valueClassType = entry.getValue().getClass().getSimpleName();
            System.out.println("key type : "+entry.getKey().getClass().getSimpleName());
            System.out.println("value type : "+valueClassType);
        }
    }
}