You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取PsiField的泛型类型?IDEA插件开发技术求助

解决方案

要获取这类泛型参数的真实上界类型,完全可以通过IntelliJ的PSI库实现,核心是解析泛型参数的约束信息,具体步骤如下:

1. 定位泛型参数的定义来源

先从当前的PsiWildcardType(即? extends B)中获取其绑定类型B,再找到B对应的Class1泛型参数定义:

// 假设已拿到value1的PsiType(Map<String, ? extends B>)
val mapType = psiType as PsiClassReferenceType
val valueTypeParam = mapType.typeParameters[1] as PsiWildcardType
// 获取wildcard的上界类型(即B)
val bType = valueTypeParam.bounds[0] as PsiClassReferenceType
// 解析B对应的泛型参数定义
val bClassRef = bType.reference.resolve() as PsiTypeParameter

2. 获取泛型参数的上界约束

拿到PsiTypeParameter(B的定义)后,直接读取extendsListTypes就能得到它的上界类型Class2:

// 获取B的上界类型数组,取第一个元素即为Class2
val upperBoundType = bClassRef.extendsListTypes[0]
// 输出全限定类型名
println(upperBoundType.canonicalText)

3. 处理value2的类型(无通配符场景)

对于value2的Map<String, B>,直接获取第二个类型参数,再按上述步骤解析泛型参数上界即可:

val value2Type = class1PsiClass.findFieldByName("value2", false)?.type as PsiClassReferenceType
val bTypeForValue2 = value2Type.typeParameters[1] as PsiClassReferenceType
val bParam = bTypeForValue2.reference.resolve() as PsiTypeParameter
val value2UpperBound = bParam.extendsListTypes[0]

关键注意点

  • 解析过程中需做空安全判断,bounds、extendsListTypes可能为空,要处理null情况。
  • 若泛型参数有多个上界(如B : Class2, Class3),需遍历extendsListTypes数组获取所有约束。

内容的提问来源于stack exchange,提问作者Lennier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:03:19