假设我有一个带有字段refCount
的基类。我不小心创建了一个派生类,该类也声明了一个具有相同名称的字段。 (实际上,名称并不重要:重要的是类型,即ReferenceCount;但是名称相当一致。)这是浪费内存,因此能够自动查找此类内容会很不错。可以使用结构搜索(或其他方法)来完成此操作吗?
答案 0 :(得分:2)
看来Java | Visibility | Field name hides field in superclass
检查所做的事情与您需要的类似。
如果要通过“结构化搜索”执行此操作,则可以执行以下操作。 搜索模板:
class $X$ {
RefCount $f$;
}
并在“完全匹配”上添加以下“脚本”过滤器:
import com.intellij.psi.*;
for (PsiClass aClass : X.getSupers()) { // X refers to the template var $X$
for (PsiField field : aClass.getAllFields()) {
// compares the type of the super field with the type of field $a$
if (field.getType().equals(a.getType())) {
return true;
}
}
}
return false;
答案 1 :(得分:1)
看起来新版本的IntelliJ(2018.3)使得此操作相当容易,尽管有点尴尬。如果我知道这即将到来,我会很想使用预览版。
诀窍是首先为基类创建(并保存!)搜索模板;例如这样的
class $Class$ {RefCount $count$;}
然后执行以下操作:
class $Child$ extends $Base$ {RefCount $count$;}
然后为$Base$
添加一个“引用”过滤器,该过滤器引用您保存的模板。
如果Child扩展了Parent,这又扩展了GrandParent,则此技巧不起作用。在父级中,该字段在Child和GrandParent中声明,但在Parent中声明。我认为可以解决该问题,而不会带来太多麻烦,但是我实际上不知道如何做到这一点。