我正在尝试进行这样的方法调用,
public class GenericsTest<T> {
public static <T> Map<String, T> createMap(Class<? extends Map<String, T>> clazz) {
return null;
}
public static void main(String[] argv) {
Map<String, Integer> result = createMap(TreeMap.class);
}
}
但是我得到了这个错误,
<T>createMap(java.lang.Class<? extends java.util.Map<java.lang.String,T>>) in test.GenericsTest<T> cannot be applied to (java.lang.Class<java.util.TreeMap>)
如何解决这个问题?
最佳答案
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
为数据提供了最大的实用性。
关于java - 如何在 Java 中获取具有泛型类型的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11554192/