【发布时间】:2019-10-08 16:23:19
【问题描述】:
我有一个包含数百个接口实现的项目。我想在该接口的一个实现中找到方法的用法。 Intellij(和 Eclipse)都向我展示了该方法在所有实现中的所有用法 - 数百种。
我在界面的一个实现中突出显示该方法,右键单击并选择“查找用法”,它会显示该方法在所有实现中的所有用法。
Intellij 中的所有使用选项似乎都没有让我得到一个实现。
public interface Dog {
void bark(int volume);
}
public class Lab implements Dog {
public void bark(int volume) {
System.out.println("woof");
}
}
public class Collie implements Dog {
public void bark(int volume) {
System.out.println("woof");
}
}
public class Main {
public static void main(String[] args) {
Dog onyx = new Lab();
Dog lassie = new Collie();
onyx.bark(50);
lassie.bark(20);
}
}
如果我突出显示 Lab bark 方法,单击 show usages,我只想查看 main.java 中的 onyx.bark(50) 行,而不是 main.java 中的两个 bark 用法。
我意识到,如果我在主类中使用 Lab onyx = new Lab() 和 Collie lassie = new Collie(),find references 将起作用,但这不是项目的编写方式。当类型是接口时,IDE可能无法确定实现类,但它肯定会有用。
【问题讨论】:
-
很棒的问题。我通常会单步调试调试器以找出当时正在使用的实现,但必须有更好的方法来做到这一点。
-
嗯,接口的重点是能够在运行时将一个实现交换为另一个实现。您的示例非常简单,似乎 IDE 应该能够“知道”
onyx和lassie的实际类型,但考虑一个更复杂的场景:如果某些库、反射代码等会发生变化怎么办那些参考? IDE 如何知道在运行时会调用哪个?这是一项相当困难的任务(至少对于任意代码而言),因此 IDE 将向您展示 可能 最终调用该单个实现的所有用法。 -
为了说明 Thomas 的观点:想象一个方法
public static void barkTwice(Dog dog)。 IDE 如何知道哪个实现作为参数传递? -
是的 - 我想不出 IDE 可以在运行时知道类型是什么的方法,但我认为它可能会根据它在 main 中的分配方式进行猜测。我想我可以搜索“= new Lab()”或构造函数本身的实例,但我正在使用的实际项目使用 spring - 所以没有使用任何明显的构造函数。通过 items.xml 搜索应该可以,但仍然不容易。
标签: java intellij-idea