public Object[] convertTo(Map source, Object[] destination) {
...
}
是否有可能通过Reflection找出我的Map参数的泛型类型(键/值)?
答案 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>
,无法在运行时找出Key
和Value
。这是由于type erasure(另请参阅Wikipedia)。
但是,可以检查地图中包含的每个对象(键或值),并调用它们的getClass()
方法。这将告诉您该对象的运行时类型 。请注意,这仍然不会告诉您有关编译类型类型Key
和Value
的任何信息。
答案 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);
}
}
}