Есть ли какие-либо ограничения на имя переменной, чтобы она не конфликтовала с именем пакета?
Предположим, у меня есть один тестовый класс в тестовом пакете:
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);
}
}
Однако вам, вероятно, следует пересмотреть имя ваших переменных, так как это может привести к некоторой путанице, особенно когда другие пытаются прочитать ваш код.