博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java泛型 - 能否取出Map<String, Integer>的泛型参数?
阅读量:7221 次
发布时间:2019-06-29

本文共 1133 字,大约阅读时间需要 3 分钟。

这两天有一个小需求:

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

Google过后,第一条就是StackOverflow的相关问题:

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

问题:

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

回答1:

被采纳的答案

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

回答2:

未被采纳

你可以轻松地通过反射获取到泛型参数。
private Map
genericTestMap = new HashMap
();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的代码仅在特定情况下有效。

转载地址:http://lihym.baihongyu.com/

你可能感兴趣的文章
【云简评】之二《不做不死的Verizon云服务48小时停机事件》
查看>>
Oracle RAC日常基本维护命令
查看>>
QT Sqlite ARM 编写程序
查看>>
Oralce7和Oralce8里大对象的比较
查看>>
2011年存储行业重点厂商盘点---初志
查看>>
Activiti初学者教程
查看>>
SVN 1053: 服务没有及时响应启动或控制请求
查看>>
==与equal的区别 这次我理解了,你呢?
查看>>
利用searchview搜索应用程序
查看>>
教你用Python解决非平衡数据问题(附代码)
查看>>
服务器端编程心得(三)—— 一个服务器程序的架构介绍
查看>>
JQuery 知识点(find;is)
查看>>
七牛云 X 英语流利说:教育 3.0 时代的智能突破
查看>>
Cannot find autoconf. Please check your autoconf i
查看>>
图解DHCP的4步租约过程
查看>>
bindservice使用例子
查看>>
我的友情链接
查看>>
mysql linux安装yum
查看>>
mysql 5.5 .17 多实例的例子
查看>>
我的友情链接
查看>>