gpt4 book ai didi

java - 查找可以实例化的相关类型

转载 作者:行者123 更新时间:2023-12-01 10:42:24 26 4
gpt4 key购买 nike

在 Eclipse(火星,FWIW)中,我试图构建与另一种类型相关的类型列表。我所说的“相关”是指我可能有时需要 X 类型的父类(super class)型,而另一时间我可能需要 X 类型的子类型。到目前为止,一切都很好。这听起来很像 Eclipse "Open Type" dialog restricted to a particular interface 。但是...

我只想要可以在代码中的特定点实际使用的类型。例如,我想替换下面的 null:

myFoo.setBar(null);

其中 setBar() 声明如下:

public class Foo {
// ...
public void setBar(Bar theNewBar) {
this.myBar = theNewBar;
}
// ...
}

我不关心对 Bar 或其子类型的现有实例的引用,我只关心 Bar 本身及其可以当场实例化的子类型,就好像我要写:

myFoo.setBar(new SubBar());

因此,具体来说,声明为 private 的类型将被排除。 Local 类型将被排除(除非我可以确定它们是在我当时正在使用的方法中声明的)。在其他地方声明的匿名内部类已经过时了。所以......等待它...根据其声明插件中定义的访问规则不可见的任何类型(即其插件不会导出它)。(毕竟这是 Eclipse,我关心是否符合插件模型。)有一些 Code Assist 选项可以排除这些类型(我认为 CODEASSIST_DISCOURAGED_REFERENCE_CHECK 和 CODEASSIST_FORBIDDEN_REFERENCE_CHECK 可以满足我的要求),但 Code Assist 无法区分子类型或父类(super class)型。

所以基本上,如果我不能直接实例化它,并且我不能为它编写匿名内部类,我就不想看到它。

我尝试过使用 ITypeHierarchy,但在创建它或它返回的 ITypes 中我看不到任何可用于区分的方法我上面提到的标准。

IType.isLocal()IType.isAnonymous() 帮助。我可以使用它们来排除本地和匿名类型。但其他人呢?例如,我不关心类型是否 protected 或默认包,我关心是否可以实例化它。某些 protected 包默认类型可以在代码中的任何给定点实例化,而其他类型则不能。

但是,我确实希望看到如果将其声明插件添加到我的manifest.mf依赖项中则可以实例化的类型。

如何找到我想要的类型(使用 ITypeHierarchy 或任何其他机制),或从 ITypeHierarchy 中排除我不想要的类型>?

最佳答案

ITypeIMember ,其中有 int getFlags() 返回 Flags 定义的标志的方法,它有很好的辅助方法,例如:

Flags.isAbstract(iType.getFlags())
Flags.isInterface(iType.getFlags())
Flags.isPackageDefault(iType.getFlags()) // You then compare package yourself
Flags.isProtected(iType.getFlags()) // You then compare package yourself
Flags.isPublic(iType.getFlags())

关于java - 查找可以实例化的相关类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34373830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com