2017-12-29 40 views
1

anwserから、彼はthisをキャストすることによってスーパークラスのスーパークラスからシャドー変数にアクセスできますが、メソッド呼び出しはオブジェクトの実行時の型に基づいて決定されるため、メソッド呼び出しでは機能しません。スーパークラスからの影付き変数へのアクセス

しかし、渡すパラメータの型を明示的にキャストしなくても、なぜ影付きの変数を取得できますか?

出力を生成
interface I { int x = 0; } 
class T1 implements I { int x = 1; } 
class T2 extends T1 implements I { int x = 2; } 
class T3 extends T2 implements I { 
    int x = 3; 

    void test() { 
     System.out.println("((T3)this).x=" + ((T3)this).x + "; getT3(this)=" + getT3(this)); 
     System.out.println("((T2)this).x=" + ((T2)this).x + "; getT2(this)=" + getT2(this)); 
     System.out.println("((T1)this).x=" + ((T1)this).x + "; getT2(this)=" + getT1(this)); 
     System.out.println("((I)this).x=" + ((I)this).x + "; getI(this)=" + getI(this)); 
    } 

    public static void main(String[] args) { 
     new T3().test(); 
    } 

    int getT3(T3 t3) { return t3.x; } 
    int getT2(T2 t2) { return t2.x; } 
    int getT1(T1 t1) { return t1.x; } 
    int getI(I i) { return i.x; } 
} 

((T3) this).x = 3; getT3(this) = 3 
((T2) this).x = 2; getT2(this) = 2 
((T1) this).x = 1; getT1(this) = 1 
((I) this).x = 0; getI(this) = 0 

私は正しく彼のanwserを理解していれば、すべきではないgetT3getT2getT1getI方法すべての戻り3?

+0

「getI」、「getT1」、「getT2」、「getT3」とは何ですか? –

+1

@JacobG。私は質問を書くときにゲッターメソッドを追加するのを忘れてしまった。 – MiP

+0

私はインターフェイスの** x **は私はサブクラスを継承しないとは思わない –

答えて

2

メソッドのシグネチャがIT1T2、及びT3を期待するのでi.xを返すとき、パラメータはこれらのタイプとして扱われ、t1.x、等

だからgetT2(this)を呼び出すとgetT2((T2) this)を呼び出すと本質的に同等です。

だからこそ、それらはすべて3を返すわけではなく、その特定のタイプの値はxです。

私はよくこのことを説明しましたが、T3T2を拡張するためgetT2に渡されたとき、それは暗黙的にT2のインスタンスにキャストされるかわかりません。

関連する問題