如何在Java中使用generics类型获取类

我想尝试这样的方法调用,

public class GenericsTest { public static  Map createMap(Class<? extends Map> clazz) { return null; } public static void main(String[] argv) { Map result = createMap(TreeMap.class); } } 

但我收到这个错误,

 createMap(java.lang.Class<? extends java.util.Map>) in test.GenericsTest cannot be applied to (java.lang.Class) 

如何解决这个问题?

 Map instance = new TreeMap(); @SuppressWarnings("unchecked") Map map = createMap((Class>)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 ,你可以自己实例化一个带有generics类型参数的Map ,如下所示:

 public static  Map getMap() { return new TreeMap(); } 

然后您可以在没有警告的情况下访问它:

 // note the lack of type arguments, which are inferred Map instance = getMap(); // alternatively, you could do it more explicitly: // Map instance = ClassName.getMap(); 

他们真的没有理由要求你提供Map类型,除了给你一个完全匹配的实现(例如,如果你坚持使用HashMap ,那么你将得到一个HashMap ,如果你坚持一个TreeMap ,然后你会得到一个TreeMap )。 但是,我怀疑TreeMap将丢失它所构造的任何Comparator ,并且由于这是TreeMap的不可变( final )字段,那么你无法修复它; 这意味着在这种情况下Map不一样,也不可能是你想要的。

如果他们用数据填充Map ,那么它就更没意义了。 你总是可以传入一个Map实例来填充,或者让它们返回一个你可以简单包装的Map (例如, new TreeMap(instance); ),他们应该知道哪个Map提供最多的实用程序对数据。