Я сделал несколько тестов. Первое, что я заметил, это то, что вам нужен только один статический оператор импорта для нескольких методов с одинаковым именем.
public class EqualsClass {
public static boolean equals(Object o1, Object o2) {
return o1 == null ? o2 == null : o1.equals(o2);
}
public static boolean equals(Object o1, Object o2, Object o3) {
return equals(o1, o2) && equals(o2, o3);
}
}
import static mypackage.EqualsClass.equals;
public class TestClass {
public static void main() {
Object o1 = new Object();
Object o2 = new Object();
equals(o1, o2); // Compiles - static context
Object o3 = new Object();
equals(o1, o2, o3); // No extra static import required
}
Тогда я заметил, что это не работает в контексте экземпляра:
public void someInstanceMethod() {
Object o1 = new Object();
Object o2 = new Object();
equals(o1, o2); // Does not compile - instance context
Object o3 = new Object();
equals(o1, o2, o3); // As expected does not compile
}
}
Но тогда, если я закрою статический импорт собственным статическим методом класса:
public static boolean equals(Object o1, Object o2) {
return EqualsClass.equals(o1, o2); // Compiles
}
public void someInstanceMethod() {
equals(new Object(), new Object()); // Compiles!!
equals(new Object(), new Object(), new Object()); // Doesn't compile!
}
Тот факт, что он работает в статическом контексте, имеет для меня разумный смысл. Тем не менее, похоже, что существует существенная разница между разрешением статически импортированного метода и определенного статического метода класса.
Резюме:
- Методы с тем же именем, что и у метода экземпляра, недоступны при статическом импорте из контекста экземпляра.
- Статические методы из одного и того же класса с тем же именем могут быть доступны из контекста экземпляра.
- Статический импорт дает вам доступ ко всем статическим методам с тем же именем из этого класса, несмотря на сигнатуру (параметры и возвращаемое значение).
Мне было бы интересно увидеть часть спецификации JLS или компилятора, которая определяет разрешение статического импорта компилятором и как они перекрываются локальными методами.