public class X {
public void close() {
// ...
}
public class XInputStream extends InputStream {
public void f() {
close(); // are we calling close() on InputStream or X??
}
}
}
编译器很好用这种东西,很明显它知道调用哪种方法。解决此问题的语言规范中究竟有什么规则?
除了重命名我的close()
方法之外,我是否可以采取任何措施使这些代码更具可读性?
答案 0 :(得分:7)
JLS的相关部分是§6.4.1。基本上,编译器将在可能的最小范围内查找正确的方法。它检查的第一个范围是XInputStream
。它找到一个close
方法,因此它会调用该方法。
为了使其更具可读性,您可以限定方法调用:this.close()
致电InputStream::close
或X.this.close()
致电X::close
。
答案 1 :(得分:0)
因为你有一个内部类:
public class XInputStream extends InputStream
这里调用的close()方法是在您从中扩展的InputStream类中找到的方法。
此外,您必须使用try-catch包装close()方法,并且任何扩展InputStream的类都必须声明为abstract或实现方法read()。