ztcaoll222
V2EX  ›  Java

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

  •  
  •   ztcaoll222 · Feb 20, 2020 · 3424 views
    This topic created in 2281 days ago, the information mentioned may be changed or developed.

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

    // 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 replies    2020-02-21 14:18:53 +08:00
    CismonX
        1
    CismonX  
       Feb 20, 2020
    ParameterizedType::getActualTypeArguments 在某种程度上可以满足你的要求

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

    调用 TypeVariable::getName 得到 "K" "V",map 一下就行了。
    ztcaoll222
        5
    ztcaoll222  
    OP
       Feb 21, 2020
    @CismonX #4 谢谢实测好用
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3014 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 14:47 · PVG 22:47 · LAX 07:47 · JFK 10:47
    ♥ Do have faith in what you're doing.