2017-10-04 11 views
-2

私は同じ変数名を持つ2つのインターフェースを持っていますが、この変数名は2つのインターフェース名の1つと同じです。
例えばiは上記の二つのインターフェースを実装するクラスを有するJavaインターフェース変数のあいまい性

interface Parent1{ 
    public static final String Parent1= "VALUE1"; // Variable Parent1 is same as interface name 
} 
interface Parent2{ 
    public static final String Parent1= "VALUE2"; 
} 

言えば、私はインターフェイス親1における可変親1にアクセスする必要がある場合、どのようにしてアクセスすることができます。
例えば、

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 
+3

私のためにうまくコンパイルします。 –

+0

これは、問題に直面しているところで働いています。それは働いています – iamsankalp89

+0

どのJavaのバージョンを使用していて、どのコンパイラですか?また...あなたは>> @<< JoeCを使っていますか? –

答えて

1

私はあなたが親1を参照して呼び出している間、どのように「Paret1」変数に、この曖昧さを克服するJavaことを知らせたいと言います。

Javaが正確なアドレスを取得する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(); 
    } 
+1

これはParent1を単独で使用しているようです。内部の子クラスを使用する方法は、この問題を解決するものではありません。それを単独で使用するには、リフレクションは必要ありません。単にParent1.Parent1として呼び出すことができます。 – nagendra547

関連する問題