重载Math.sqrt:重载方法似乎隐藏了原始方法

Pra*_*eek 9 java methods static overloading

试图重载类型的java.lang.Math.sqrt静态方法int:

import static java.lang.Math.sqrt;

class Test
{
    private static double sqrt(int n)
    {
        return sqrt(1.0 * n);
    }

    public static void main(String[] args)
    {
        System.out.println(sqrt(1));
    }
}
Run Code Online (Sandbox Code Playgroud)

出现奇怪的错误:

Test.java:7: sqrt(int) in Test cannot be applied to (double)
                return sqrt(1.0 * n);
                       ^
1 error
Run Code Online (Sandbox Code Playgroud)

但是当明确引用该java.lang.Math.sqrt方法时,一切正常:

class Test
{
    private static double sqrt(int n)
    {
        return Math.sqrt(1.0 * n);
    }

    public static void main(String[] args)
    {
        System.out.println(sqrt(1));
    }
}
Run Code Online (Sandbox Code Playgroud)

使用的编译器是标准的javac,版本1.6.0_16.

所以问题是:

  1. 为什么编译器在第一种情况下无法解决重载问题?
  2. 这种行为在java语言规范中指定在哪里?

提前致谢.

sep*_*p2k 13

您只能在同一个类中重载方法.即,如果您导入另一个类的静态方法,然后使用相同的名称定义自己的方法,则不会有重载决策.将简单地忽略该方法的导入版本.

对于已指定该行为:语言规范定义重载这样的:

如果一个类的两个方法(无论是在同一个类中声明,还是由一个类继承,或者一个是声明的,一个是继承的)都具有相同的名称,但签名不是覆盖等价的,那么方法名称就是超载.

请注意,它说"一个类的两个方法".因此,根本不考虑从另一个类导入的方法.

因此,由于您的定义不是Math.sqrt的重载,因此它会根据定义的第6.3.1节影响它:

名为n的方法的声明d会影响名称为n的任何其他方法的声明,这些声明位于整个d范围内d出现的位置的封闭范围内.