Map<String, Integer> instance = new TreeMap<String, Integer>();
@SuppressWarnings("unchecked")
Map<String, Integer> map =
createMap((Class<? extends Map<String, Integer>>)instance.getClass());
map.put("x", 1);
System.out.println("THIS IS x: " + map.get("x"));
这将适当地打印出 1. 该方法的实现最有可能
try
{
return clazz.newInstance();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
他们的 API 的一个更好的实现是让他们询问你的类型,T
,并让他们回馈Map
他们的选择,而不是询问您所有的细节。否则,只要他们不填写Map
对于任何数据,您都可以实例化Map
自己使用泛型类型参数,如下所示:
public static <T> Map<String, T> getMap()
{
return new TreeMap<String, T>();
}
然后您可以在没有警告的情况下访问它:
// note the lack of type arguments, which are inferred
Map<String, Integer> instance = getMap();
// alternatively, you could do it more explicitly:
// Map<String, Integer> instance = ClassName.<Integer>getMap();
他们确实没有理由向您索要Class
你的类型Map
除了给你一个与实现完全匹配的结果(例如,如果你坚持HashMap
,那么你会得到一个HashMap
,如果你坚持TreeMap
,那么你会得到一个TreeMap
)。然而,我怀疑TreeMap
将失去任何Comparator
它是用它构建的,并且因为它是一个不可变的(final
) 现场TreeMap
,那么你就无法解决这个问题;这意味着Map
在这种情况下是不一样的,也不太可能是你想要的。
如果他们填写的是Map
有了数据,那就更没有意义了。你总是可以传入一个实例Map
填写,或让他们返回Map
您可以简单地包装(例如,new TreeMap<String, Integer>(instance);
),他们应该知道哪个Map
为数据提供最大的实用性。