java - 如何在 Java 中获取具有泛型类型的类

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

如何解决这个问题?

最佳答案

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

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

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

关于java - 如何在 Java 中获取具有泛型类型的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11554192/

相关文章:

java - 我该如何解决这个问题我一直得到零作为我的答案而不是我的条件

java - 如何 (i << 48) | ((i & 0xffff0000L) << 16) | ((i >>> 16) & 0xffff0000L) | (i >>> 48) 工作?

java - 如何按数字对包含另一张 map 的 map 进行排序

java - Lombok IntelliJ IDEA 插件 : Use of var is disabled by default

java - Json Deserializer - 如何从父 JSON 对象获取数据

java - 设计 Java 通用层次结构以避免模板类冲突

java - 泛型类的新对象上的绑定(bind)不匹配

c# - 字典对象性能

generics - Swift 3,元类型问题中的 ".self"是否真的正确?

基于属性值的 LINQ 不同选择