如何获取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
相关产品推荐
相关产品推荐

