Java泛型 - 能否取出Map的泛型参数?

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java泛型 - 能否取出Map的泛型参数?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

这两天有一个小需求:

  • 运行时取出Map对象实例的泛型参数。

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

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

问题:

public Object[] convertTo(Map source, Object[] destination) {     ... }
是否有可能通过反射来获取到Map的泛型参数?

回答1:

被采纳的答案

对于任意的Map<Key, Value>,要在运行时获取到它的KeyValue类型是不可能的。这是因为类型擦除
然而,可以在运行时通过getClass()检查map里每个对象的真实类型。再一次说明,这仍然不会告诉你KeyValue的类型。(笔者注:考虑接口与实现的关系)

回答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的代码仅在特定情况下有效。

脚本宝典总结

以上是脚本宝典为你收集整理的Java泛型 - 能否取出Map的泛型参数?全部内容,希望文章能够帮你解决Java泛型 - 能否取出Map的泛型参数?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。