Статический импорт с одинаковыми именами статических переменных
Я делаю статический импорт членов класса Long и Integer:
import static java.lang.Integer.MAX_VALUE;
import static java.lang.Long.MAX_VALUE;
Теперь, если я пытаюсь использовать эту переменную MAX_VALUE и распечатать ее, я получу ошибку:
import static java.lang.Integer.MAX_VALUE;
import static java.lang.Long.MAX_VALUE;
public class StaticImportDemo2 {
public static void main(String[] args) {
//Error :: The field MAX_VALUE is ambiguous
System.out.println("Print without static import Integer.MAX_VALUE "+MAX_VALUE);
}
}
Это отлично. Чтобы устранить ошибку, мне придется удалить один статический импорт, чтобы устранить эту неоднозначность.
Основная проблема, которую я получаю, заключается в том, если я использую подстановочный знак *
при статическом импорте класса Integer класс компилируется без ошибок:
import static java.lang.System.out;
import static java.lang.Integer.*;
import static java.lang.Long.MAX_VALUE;
public class StaticImportDemo2 {
public static void main(String[] args) {
System.out.println("Print without static import Integer.MAX_VALUE " + MAX_VALUE);
}
}
Неопределенность все еще должна существовать. Почему это компилируется без проблем?
1 ответ
Почему это компилируется без проблем?
Потому что спецификация языка Java говорит, что это так. См. Главы 6 и 7, но особенно из 6.4.1:
Объявление типа import-on-demand никогда не приводит к затенению любого другого объявления.
Объявление static-import-on-demand никогда не приводит к затенению любого другого объявления.
И это, вероятно, потому, что очень удобно иметь возможность импорта целых пакетов с помощью подстановочных знаков, но иногда вам придется разрешать конфликты. Было бы плохо (особенно в дни до IDE), если бы единственной альтернативой было явное импортирование каждого элемента. Таким образом, специфический (не подстановочный) импорт получил приоритет. Таким образом, вы просто указываете, что вы имеете в виду для неоднозначных элементов, которые вы хотите использовать.