考虑我有两个具有相同变量名称的接口,并且此变量名称与两个接口名称之一相同 例如,
interface Parent1{
public static final String Parent1= "VALUE1"; // Variable Parent1 is same as interface name
}
interface Parent2{
public static final String Parent1= "VALUE2";
}
假设我有一个实现上述两个接口的类,如果我需要访问接口Parent1中的变量Parent1,我该如何访问。
例如,
class Child implements Parent1, Parent2{
void myCode(){
System.out.println(Parent1.Parent1); // Does not compile. Because Parent1(before dot) is considered as variable
System.out.println(Parent2.Parent1); // Does compile
}
}
我知道变量名称不符合标准。但是想了解java如何克服这种模糊性。
编辑:
人们说它正在发挥作用(在评论中)。但是当我执行它时说
/Child.java:9: error: reference to Parent1 is ambiguous
System.out.println(Parent1.Parent1); // Does not compile. Because Parent1(before dot) is considered as variable
^
both variable Parent1 in Parent1 and variable Parent1 in Parent2 match
/Child.java:9: error: cannot find symbol
System.out.println(Parent1.Parent1); // Does not compile. Because Parent1(before dot) is considered as variable
^
symbol: variable Parent1
location: variable Parent1 of type String
2 errors
答案 0 :(得分:1)
我想告诉您,当您使用Parent1引用调用时,java如何克服“Paret1”变量上的这种歧义。
当您调用Parent2.Parent1时,Java将获得确切的地址。 但是由于Parent1,Parent2接口的实现,属性'Parent1'被认为是一个不明确的属性。 因为这些是保存在JVM内部方法区域内的静态变量。
所以,如果你想访问那个变量值,你必须给编译器提供准确的引用。为此你可以使用反射。如下所示,
try {
Class parent = Class.forName("yourpackage.Parent1");
Field field = parent.getDeclaredField("Parent1");
field.setAccessible(true);
Object value = field.get(parent);
System.out.println(value); // this will print out the 'Parent1' value
} catch (Exception e) {
e.printStackTrace();
}