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


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

是否有可能通过反射来计算Map参数的通用类型(键/值(?

我知道这个问题很老,但最好的答案是错误的
您可以通过反射轻松地获得泛型类型。这里有一个例子:

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

给定一个Map<Key,Value>,在运行时不可能计算出KeyValue。这是由于类型擦除(另请参阅维基百科(。

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

您可以通过获取每个元素并对每个元素的键/值对象调用getClass来检查class中源对象中的条目。当然,如果映射在源代码处没有被泛型化,那么就不能保证其中的所有键/值都是同一类型的。

您不能在运行时从映射中获取值类型,但也许您可以从destination数组中获取它(只要它不是null。(

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

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

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

相关内容

  • 没有找到相关文章

最新更新