【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()); } }
なるほど。