Java泛型 – 能否取出Map<String, Integer>的泛型参数?

这两天有一个小需求

Google过后,第一条就是StackOverflow的相关问题: 如何取出Map的泛型参数

在这做一下记录,原文问题及回答都非常有趣清晰。

问题:

public Object[] convertTo(Map source, Object[] destination) {
    ...
}

是否有可能通过反射来获取到Map的泛型参数?

回答1:

被采纳的答案

对于任意的 Map<Key, Value>
,要在 运行时
获取到它的 Key
Value
类型是不可能的。这是因为 类型擦除

然而,可以在 运行时
通过 getClass()
检查map里每个对象的真实类型。再一次说明,这仍然不会告诉你 Key
Value
的类型。(笔者注:考虑接口与实现的关系)

回答2:

未被采纳

你可以轻松地通过反射获取到泛型参数。

private Map<String, Integer> genericTestMap = new HashMap<String, Integer>();

public static void main(String[] args) {

    try {
        Field testMap = Test.class.getDeclaredField("genericTestMap");
        testMap.setAccessible(true);

        ParameterizedType type = (ParameterizedType) testMap.getGenericType();

        Type key = type.getActualTypeArguments()[0];
        System.out.println("Key: " + key);
        Type value = type.getActualTypeArguments()[1];
        System.out.println("Value: " + value);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

评论最精彩

回答2贴出的代码非常有效,能够完整地取出 Map<Key, Value>
的泛型参数。于是有人质疑为何回答2没有被采纳。

于是有人解释道:

被采纳的回答1才是正确的。回答2只是抽取了Field字段中的类型声明。这与 在运行时获取对象实例的泛型参数
是不一样的操作。尤其题主的代码中的 Map
并没有带任何泛型参数,这种情况甚至无法从 参数声明
中获取泛型。所以回答2的代码仅在特定情况下有效。

原文 

https://segmentfault.com/a/1190000018375841

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java泛型 – 能否取出Map<String, Integer>的泛型参数?

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址