Есть ли какие-либо ограничения на имя переменной, чтобы она не конфликтовала с именем пакета?

Предположим, у меня есть один тестовый класс в тестовом пакете:

package test;

public class Test {

    private static int clarying=20;

    public static void main(String[] args) {
        clarying.Product.display(clarying); // this line is giving error 
                                            // The primitive type int of
                                            // clarying does not have a field Product
    }
}

Предположим, у меня есть другой продукт класса в упаковке:

package clarying;

public class Product {
    private static int test;

        public static void display(int data) {
            test = data;
            System.out.println(test);
        }
}

Я скомпилировал класс Product, и теперь я пытаюсь скомпилировать класс Test, но он выдает ошибку компилятора:

 Exception in thread "main" java.lang.Error:
 Unresolved compilation problem:  
 The primitive type int of clarying does not have a field Product
  at test.Test.main(Test.java:5)

вопрос в очереди:

clarying.Product.display(clarying);

Поскольку имя переменной в классе Test является clarying, то же самое, что и имя пакета clarying. Поэтому, когда я пишу clarying.Product, он ищет поле Product внутри переменной класса clarying.

Я просто хочу уточнить: есть ли правила против определения переменной с тем же именем, что и пакет?

2 ответа

Решение

Вы можете прочитать полные правила здесь: 6.4.2. Сокрытие

Простое имя может встречаться в тех случаях, когда оно потенциально может интерпретироваться как имя переменной, типа или пакета. В этих ситуациях правила §6.5 указывают, что переменная будет выбрана в предпочтении к типу, и что тип будет выбран в предпочтении к пакету. Таким образом, иногда бывает невозможно сослаться на видимое объявление типа или пакета через его простое имя. Мы говорим, что такая декларация скрыта.

Да, есть правило. Компилятор думает, что вы имеете в виду поле clarying, У него нет никакого способа узнать, что вы на самом деле имеете в виду пакет, и я не думаю, что есть способ сказать ему, что вы имеете в виду пакет (который должен быть чем-то вроде this но имеется в виду корень пакета вместо текущего экземпляра). Так как поле просто int вы получите ошибку, которая у вас есть.

Если вы хотите обойти это просто импортировать Product учебный класс:

package test;

import clarying.Product;

public class Test{
    private static int clarying=20;

    public static void main(String[] args) {
        Product.display(clarying);
    }
}

Однако вам, вероятно, следует пересмотреть имя ваших переменных, так как это может привести к некоторой путанице, особенно когда другие пытаются прочитать ваш код.

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