繁体   English   中英

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

[英]How to get class with generics types in Java

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM