V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ztcaoll222
V2EX  ›  Java

请问有办法获得 map 的 k 和 v 对应的类型吗 ?

  •  
  •   ztcaoll222 · 2020-02-20 16:39:53 +08:00 · 1683 次点击
    这是一个创建于 451 天前的主题,其中的信息可能已经有所发展或是发生改变。

    标题只是举一个例子,真实需求是定义一个类

    // K, V 顺序不同,我故意的
    public class TestD<V, K> {
        private K key;
        private V value;
    }
    

    在另一个地方定义

    public class TestA {
        private TestD<String, Integer> testD ;
    }
    

    已知可以通过

    ParameterizedType type = (ParameterizedType) TestA.class.getDeclaredField("testD").getGenericType();
    

    获得具体的类型的数组,但无法知道 K 对应的是什么类型,V 对应的是什么类型

    所以怎么样获得它们的对应信息 ?

    5 条回复    2020-02-21 14:18:53 +08:00
    CismonX
        1
    CismonX   2020-02-20 17:11:25 +08:00
    ParameterizedType::getActualTypeArguments 在某种程度上可以满足你的要求

    但是由于 JVM 的类型擦除,类型参数必须在编译期确定,才能用这种方式获取到
    ztcaoll222
        2
    ztcaoll222   2020-02-20 17:15:05 +08:00
    @CismonX #1 审题啊,“获得具体的类型的数组” 就是指 getActualTypeArguments 这个函数
    Asuka3
        3
    Asuka3   2020-02-20 18:07:11 +08:00 via iPhone
    @CismonX 现在还擦除吗 我上次反编译完泛型,发现可以保留泛型信息
    CismonX
        4
    CismonX   2020-02-20 18:13:53 +08:00   ❤️ 1
    @ztcaoll222 哦,抱歉没看清楚。这个可以通过 TestD.class.getTypeParameters() 得到一个 TypeVariable 的数组,它的顺序和 getActualTypeArguments 一样,都和实际代码里定义的顺序一致的

    调用 TypeVariable::getName 得到 "K" "V",map 一下就行了。
    ztcaoll222
        5
    ztcaoll222   2020-02-21 14:18:53 +08:00
    @CismonX #4 谢谢实测好用
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2045 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:35 · PVG 23:35 · LAX 08:35 · JFK 11:35
    ♥ Do have faith in what you're doing.