この問題は、私と私の友人が試験のために勉強していたときに現れました。静的に割り当てられた変数のメソッドを呼び出すときの奇妙な動作に気付きました。
Code>Words では、次のようにします。
class C {
public void a(double x) {}
}
class D extends C {
void b() {}
}
class F extends D {
void a(int i) {}
void a(double d) {}
今、やっている
D foo = new F();
foo.a(1);
これは何を与えるでしょうか?まあ.. Fでメソッドa(double)を実行します!!
これは私たちが考えたことです:
- プログラムは、静的型Dの aを探すことから始めます。そこには何もありません。
- そのスーパー クラスCに移動します。a(int)は検出されませんが、代わりにa(double)が検出されます。
- これが私が意図した署名 (つまり a(double)) であると判断しますが、最初に、このすべての検索の後、最初に動的型を見てみましょう!
- F でa(double)を実行します!
これは正しいです?これは、int から double への型変換が行われた場合に適合する可能性のあるメソッドを見つけるために階層を登ったことを意味します。この後、動的型にこの新しく解釈されたシグネチャがあるかどうかを確認します。
追加したら気づいた
void a(int) {}
**クラス Cでは、上記の呼び出しを実行するとFでa(int)が返されます!
誰かがこのプロセスに関与するメカニズムを説明できますか? コードがこのように実行/コンパイルされるのはなぜですか? この背後にある技術的な理由は何ですか? また、同様の状況に関して、他に注意すべき点はありますか ()