Статический импорт с одинаковыми именами статических переменных

Я делаю статический импорт членов класса 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), если бы единственной альтернативой было явное импортирование каждого элемента. Таким образом, специфический (не подстановочный) импорт получил приоритет. Таким образом, вы просто указываете, что вы имеете в виду для неоднозначных элементов, которые вы хотите использовать.

Другие вопросы по тегам