如何获得泛型类型的 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>
。我怎么知道 fieldT
是 String
而 fieldV
是 Integer
?
class Test<T, V>
只是一个demo,我无法使用getParameters()
方法获取类型,因为字段顺序不固定。有可能在fieldV
之后声明了fieldT
field.getType().substitute(classReferenceType.resolveGenerics().getSubstitutor())
应该可以胜任。
fieldT.getType()
在你的例子中必须 return T
classReferenceType.resolveGenerics()
(returns 一对 class 及其替代),在您的示例中 Test
和 T -> String, V -> Integer
- 方法替换会将类型中的 T 替换为字符串,将 V 替换为整数
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>
。我怎么知道 fieldT
是 String
而 fieldV
是 Integer
?
class Test<T, V>
只是一个demo,我无法使用getParameters()
方法获取类型,因为字段顺序不固定。有可能在fieldV
fieldT
field.getType().substitute(classReferenceType.resolveGenerics().getSubstitutor())
应该可以胜任。
fieldT.getType()
在你的例子中必须 returnT
classReferenceType.resolveGenerics()
(returns 一对 class 及其替代),在您的示例中Test
和T -> String, V -> Integer
- 方法替换会将类型中的 T 替换为字符串,将 V 替换为整数