这个问题是后续问题: 为什么我不能在同名的匿名类之外调用方法
这个先前的问题回答了为什么,但现在我想知道 javac是否应该找到 run(int bar)?(请参阅上一个问题以了解 run(42) 失败的原因)
如果不应该,是因为规范吗?它会产生模棱两可的代码吗?我的意思是,我认为这是一个错误。虽然前面的问题解释了为什么这段代码无法编译,但我觉得如果 javac 在树中搜索更高的位置,如果它未能在当前级别找到匹配项,它应该编译。IE。如果 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) {
}
}