Sta*_*lin 26 java scope overloading language-design static-import
通过实验,我发现即使在静态上下文中,Java非静态方法也会覆盖范围内所有相同的命名方法.即使不允许参数重载.喜欢
import java.util.Arrays;
import static java.util.Arrays.toString;
public class A {
public static void bar(Object... args) {
Arrays.toString(args);
toString(args); //toString() in java.lang.Object cannot be applied to (java.lang.Object[])
}
}
Run Code Online (Sandbox Code Playgroud)
我在规范中找不到任何相关内容.这是一个错误吗?如果不是,有没有理由实施这样的语言?
UPD:Java 6不编译此示例.问题是 - 为什么?
Voo*_*Voo 24
解释很简单,虽然它不会改变行为非常不直观的事实:
在解析要调用的方法时,编译器所做的第一件事就是找到具有正确名称方法的最小封闭范围.只有这样才会出现重载决议和游戏中的其他内容.
现在,这里发生了什么是一个包含最小的封闭范围toString()的方法是A类它继承它Object.因此,我们停在那里,不要再搜索.遗憾的是,接下来编译器会尝试找到给定范围内方法的最佳拟合,并注意到它不能调用任何方法并给出错误.
这意味着永远不会静态导入名称与Object中的方法相同的方法,因为自然在范围内的方法优先于静态导入(JLS详细描述了方法阴影,但对于这个问题,我认为它更简单记得那个).
编辑:@alf提交了JLS的正确部分,该部分描述了那些想要全局的人的方法调用.它相当复杂,但问题并不简单,所以这是预期的.