Java接口变量中的歧义

时间:2017-10-04 07:46:09

标签: java ambiguity

考虑我有两个具有相同变量名称的接口,并且此变量名称与两个接口名称之一相同 例如,

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

1 个答案:

答案 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();
    }