首页 > 解决方案 > 解析 IntelliJ 插件代码检查中的泛型类型

问题描述

我编写了一个对Java 代码执行一些检查的IntelliJ 插件。 对于其中一项检查,我需要知道通用字段的类型。 例子:


// 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两个类的访问权限。这是我到目前为止所拥有的(为简单起见,我省略了类型和空值检查):

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();
        }
    }
}

我想在使用的上下文中获得最低要求的泛型类型(the PsiReferenceExpression)。或者关于我上面的例子:

但我总是进入PsiType:B变量refTypes。我必须改变什么才能获得预期的类型?

小背景信息:我想检查反射使用的类型是否包含字段或方法。

标签: javaintellij-ideaintellij-pluginintellij-inspections

解决方案


您可能会得到list.get(0)(即喜欢refExpr.getType())的类型,它将返回DPsiTpe。


推荐阅读