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>
,在运行时不可能计算出Key
和Value
。这是由于类型擦除(另请参阅维基百科(。
但是,可以检查映射中包含的每个对象(键或值(,并调用它们的getClass()
方法。这将告诉您该对象的运行时类型。请注意,这仍然不会告诉您任何关于编译类型Key
和Value
的信息。
您可以通过获取每个元素并对每个元素的键/值对象调用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);
}
}
}