この質問はフォローアップです: 同じ名前の匿名クラスの外部でメソッドを呼び出せないのはなぜですか
この前の質問はなぜ答えますが、javacがrun(int bar)? (run(42) が失敗する理由については、前の質問を参照してください)
ダメなら仕様によるものでしょうか?あいまいなコードを生成しますか? 私のポイントは、これはバグだと思います。前の質問でこのコードがコンパイルに失敗する理由を説明しましたが、現在のレベルで一致するものが見つからない場合、javac がツリーの上位を検索した場合にコンパイルする必要があると思います。すなわち。this.run() が一致しない場合、実行メソッドの NotApplicable.this を自動的にチェックする必要があります。
また、foo(int bar) が正しく検出されていることにも注意してください。run(int bar) が見つからない理由を説明する場合は、foo(int bar) が見つかった理由も説明する必要があります。
public class NotApplicable {
public NotApplicable() {
new Runnable() {
public void run() {
// this works just fine, it automatically used NotApplicable.this when it couldn't find this.foo
foo(42);
// this fails to compile, javac find this.run(), and it does not match
run(42);
// to force javac to find run(int bar) you must use the following
//NotApplicable.this.run(42);
}
};
}
private void run(int bar) {
}
public void foo(int bar) {
}
}