Получить универсальный тип для параметра java.util.Map - PullRequest
5 голосов
/ 27 мая 2011
public Object[] convertTo(Map source, Object[] destination) {
    ...
}

Есть ли возможность определить общие типы (ключ / значение) параметра моей карты с помощью Reflection?

Ответы [ 5 ]

15 голосов
/ 22 июля 2015

Я знаю, что этот вопрос старый, но лучший ответ неправильный.
Вы можете легко получить общие типы с помощью отражений. Вот пример:

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

9 голосов
/ 27 мая 2011

Учитывая Map<Key,Value>, невозможно определить Key и Value во время выполнения. Это связано с стиранием типа (также см. Википедия ).

Однако можно проверить каждый объект (ключ или значение), содержащийся на карте, и вызвать их метод getClass(). Это скажет вам тип времени выполнения этого объекта . Обратите внимание, что это ничего не скажет вам о типах типа компиляции Key и Value.

1 голос
/ 26 декабря 2012

Таким образом, вы можете получить тип ключа и значение карты

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);
        }
    }
}
1 голос
/ 27 мая 2011

Вы не можете получить тип значения из карты во время выполнения, но, возможно, вы можете получить его из массива destination (если это не null.)

public <V> V[] convertTo(Map<?,V> source, V[] destination) {
    return source.values().toArray(destination);
}
1 голос
/ 27 мая 2011

Вы можете проверить класс на предмет записей в исходном объекте, получив каждый элемент и вызвав getClass для объекта ключ / значение для каждого. Конечно, если карта не была обобщена в источнике, тогда нет гарантии, что все ключи / значения в ней имеют одинаковый тип.

...