如何在Java中使用泛型类来获取类

时间:2012-07-19 04:58:49

标签: java generics

我正在尝试进行这样的方法调用,

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>)

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

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),他们应该知道{{1}为数据提供了最多的实用工具。