问题描述
我编写了一个 IntelliJ插件,该插件对 Java代码进行了一些检查。
对于其中一项检查,我需要了解通用字段的类型。
示例:
// Model classes B and D
public class B {
void dob() {
}
}
public class D extends B {
void doD() {
}
}
// Classes that use the model classes
public class Base<T extends B> {
protected List<T> list;
private void test() {
list.get(0).dob();
}
}
public class Derived extends Base<D> {
private void test() {
list.get(0).doD();
}
}
类Base
包含一个带有通用参数T
的列表,可从类Base
及其派生类Derived
访问该列表。
我有一个注释器(可能更改为Localinspection),用于检查两个类中对list
的访问。
到目前为止,这就是我所拥有的(为了简单起见,我省略了类型检查和null检查):
public class GenAnno implements Annotator {
@Override
public void annotate(@NotNull PsiElement element,@NotNull AnnotationHolder holder) {
if (element instanceof PsiReferenceExpression) {
PsiReferenceExpression refExpr = (PsiReferenceExpression)element;
PsiElement target = refExpr.resolve();
PsiField field = (PsiField) target;
PsiClasstype fieldType = (PsiClasstype) field.getType();
PsiClasstype itTyp = (PsiClasstype) PsiUtil.extractIterableTypeParameter(fieldType,false);
PsiClass cl = itTyp.resolve();
PsiTypeParameter tpara = (PsiTypeParameter) cl;
JvmReferenceType[] refTypes = tpara.getBounds();
}
}
}
我想根据使用情况(PsiReferenceExpression
)获得通用的最低要求类型。或从上面看我的例子:
- 在访问类
list
中的Base
时,我要输入B
- 在访问类
list
中的Derived
时,我要输入D
但是我总是在变量PsiType:B
中得到refTypes
。我必须更改什么才能获得预期的类型?
小背景信息:我想检查反射使用的类型是否包含字段或方法。
解决方法
您可能会得到list.get(0)
的类型(例如refExpr.getType()
),它将返回D
PsiTpe。