如何获得泛型类型的 PsiClassReferenceType

How can I get generic type of PsiClassReferenceType

public class RestControllerExample {
    
    @GetMapping("/test")
    public Test<String, Integer> req() {
        return null;
    }
    
    static class Test<T, V> {
        
        private T fieldT;

        private V fieldV;

        public T getFieldT() {
            return fieldT;
        }
        
        public void setFieldT(T fieldT) {
            this.fieldT = fieldT;
        }

        public V getFieldV() {
            return fieldV;
        }

        public void setFieldV(V fieldV) {
            this.fieldV = fieldV;
        }
    }
}

PsiClassReferenceType 是 Test<String, Integer>。我怎么知道 fieldTStringfieldVInteger

class Test<T, V>只是一个demo,我无法使用getParameters()方法获取类型,因为字段顺序不固定。有可能在fieldV

之后声明了fieldT

field.getType().substitute(classReferenceType.resolveGenerics().getSubstitutor()) 应该可以胜任。

  1. fieldT.getType() 在你的例子中必须 return T
  2. classReferenceType.resolveGenerics()(returns 一对 class 及其替代),在您的示例中 TestT -> String, V -> Integer
  3. 方法替换会将类型中的 T 替换为字符串,将 V 替换为整数