Статический импорт с одинаковыми именами статических переменных - PullRequest
0 голосов
/ 29 мая 2018

Я делаю статический импорт членов класса 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 Ответ

0 голосов
/ 29 мая 2018

Почему это компилируется без проблем?

Поскольку Спецификация языка Java говорит, что это так.См. Главы 6 и 7, но в особенности из 6.4.1:

Объявление типа import-on-demand никогда не вызывает затенение любого другого объявления.

Статический импортОбъявление-по-требованию никогда не приводит к затенению любого другого объявления.

И это, вероятно, потому, что очень удобно иметь возможность импорта целых пакетов с подстановочными знаками, но иногда вам придется разрешать конфликты.Было бы плохо (особенно в дни до IDE), если бы единственной альтернативой было явное импортирование каждого элемента.Таким образом, специфический (не подстановочный) импорт получил приоритет.Таким образом, вы просто указываете, что вы имеете в виду для неоднозначных элементов, которые вы хотите использовать.

...