Я делаю статический импорт членов классов 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);
}
}
Двусмысленность все еще должна существовать. Почему это компилируется без проблем?
Это то, что вы сделали из приведенного выше кода, но вопрос в том, почему это происходит?
Написано здесь плюс еще где-то стоит JLS
Также написано Рекомендуется не использовать статический импорт вообще или только в очень редких случаях. - это обычное сообщение




Why does this compile with no issues?
Потому что Спецификация языка Java говорит, что это так. См. Главы 6 и 7, особенно из 6.4.1:
A type-import-on-demand declaration never causes any other declaration to be shadowed.
A static-import-on-demand declaration never causes any other declaration to be shadowed.
И это, вероятно, потому, что очень удобно иметь возможность импортировать целые пакеты с использованием подстановочных знаков, но иногда вам придется разрешать конфликты. Было бы отстойно (особенно в дни, предшествующие IDE), если бы единственной альтернативой был явный импорт каждого элемента. Таким образом, конкретный импорт (без подстановочных знаков) имел приоритет. Таким образом, вы просто указываете, что имеете в виду для неоднозначных элементов, которые хотите использовать.
поэтому явно импортированные значения имеют приоритет