我有一个静态导入 org.junit.Assert.assertEquals
方法的 Junit4
测试用例。
import static org.junit.Assert.assertEquals;
在这个类中,我创建了一个实用方法来断言一些复杂的内部类,这些类没有实现 equals(并且也很难实现)。
private void assertEquals(MyObj o1, MyObj o2)
{
assertEquals(o1.getSomething(), o2.getSomething());
assertEquals(o1.getSomethingElse(), o2.getSomethingElse());
...
}
我希望代码的行为就像我正在“重载”我正在导入的 assertEquals
方法一样,但看起来我的私有(private)非静态方法正在隐藏 静态导入的方法。我还尝试将我的方法变为 public
和 static
(所有排列)但没有成功 - 我不得不重命名它。
为什么会这样?我在文档中找不到任何关于此行为的引用。
最佳答案
您观察到的是调用 Shadowing .当 java 中的两个类型具有相同的简单名称时,其中一个将覆盖另一个。阴影类型不能通过它的简单名称使用。
最常见的阴影类型是隐藏字段的参数。通常导致 setter 代码看起来像 setMyInt(int myInt) {this.myInt = myInt; }
现在让我们阅读 relevant documentation :
A static-import-on-demand declaration never causes any other declaration to be shadowed.
这表明按需静态导入始终排在最后,因此任何与按需导入声明具有相同简单名称的类型将始终隐藏(隐藏)静态导入。
关于java - 当类具有与导入方法同名的方法时,import static 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6595980/