9

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

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

如何解决这个问题?

4

1 回答 1

4
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他们选择的 a,而不是向您询问所有细节。否则,只要它们没有填充任何数据,您就可以像这样使用泛型类型参数Map实例化 a :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除了给你一个完全匹配的实现(例如,如果你坚持 a HashMap,那么你会得到 a HashMap,如果你坚持 a TreeMap,那么你会回来一个TreeMap)。但是,我怀疑它TreeMap会丢失任何Comparator构造它的东西,并且由于这是一个不可变的 ( final) 字段TreeMap,所以你无法修复它;这意味着Map在这种情况下不一样,也不太可能是你想要的。

如果他们正在填充Map数据,那么它就更没有意义了。你总是可以传入一个 a 的实例Map来填充,或者让他们返回Map你可以简单地包装的 a (例如,new TreeMap<String, Integer>(instance);),他们应该知道哪个Map为数据提供了最大的实用性。

于 2012-07-19T05:35:53.600 回答