せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Java】フィールドの型解決はコンパイルのタイミング。 パーフェクトJava学習感想文 余談

 

apparent type で決まるメソッドボディて
なんやろうかと、疑問に思った次第っす

という師匠の疑問に答えるべく、
 
メソッドの話ではなくて、フィールド参照時は 変数の宣言クラスによって型が解決されているという話ですね、と記事を書いたらお返事が来た。

このやりとりはこちらを参照ください
 

これは型安全性を保つために、
フィールド名の指す型が子クラスで隠されても大丈夫なように
フィールドの型解決はコンパイル時、つまりapparantでやってるわけ

なーんかまた携帯から送ってるぽいメールやなーと思いつつ改めて確認。


 

フィールドへの参照の解決

他のクラス又はインタフェースのフィールドへの参照は,そのフィールドを宣言しているクラス又はインタフェースへの記号参照に,そのフィールドの単純名を加えて,コンパイル時に解決しなければならない。

http://www.y-adagio.com/public/standards/tr_javalang/13.doc.htm

ふんふん。
「宣言してるクラス」。実際のクラスではない
Hoge a = new Foo(); の Hoge ね。
 
 
コードを再掲。
確かに「宣言しているクラス」で型解決をしているぞ。

public class Test {  
  class Base { int s = 100; }
  class Hoge extends Base { Boolean s = true; }
  public static void main(String[] args) {
    new Test().method1();
  }
  void method1() {
    Base obj = new Hoge();
    System.out.println(obj.s + 200);

    //これはコンパイルエラー。sはintと認識されている
    //System.out.println(obj.s.booleanValue());
  }
}

 
なるほど。