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

2020-02-20 16:39:53 +08:00
 ztcaoll222

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

// 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 对应的是什么类型

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

2411 次点击
所在节点    Java
5 条回复
CismonX
2020-02-20 17:11:25 +08:00
ParameterizedType::getActualTypeArguments 在某种程度上可以满足你的要求

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

调用 TypeVariable::getName 得到 "K" "V",map 一下就行了。
ztcaoll222
2020-02-21 14:18:53 +08:00
@CismonX #4 谢谢实测好用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646147

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX