如何在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 extends Map>)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
),他们应该知道哪个Map
提供最多的实用程序对数据。