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

这两天有一个小需求:

  • 运行时取出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的代码仅在特定情况下有效。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值