Java是否会阻止覆盖静态方法?

BBe*_*eta 2 java static-methods overriding

我无法理解为什么编译器在尝试编译此代码时会显示错误:

class A
{
    public static void f()
    {
        System.out.println("A.f()");
    }
}

class B extends A
{
    public static int f()
    {
        System.out.println("B.f()");
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

A和B类中两个方法之间的差异是返回类型,我读到Java防止覆盖静态方法.所以我期望编译器不应该显示任何错误,因为最初没有任何重写!

JB *_*zet 6

Java语言规范有以下规则:

8.4.8.3.覆盖和隐藏的要求

如果具有返回类型R1的方法声明d1覆盖或隐藏具有返回类型R2的另一个方法d2的声明,则对于d2,d1必须是return-type-substitutable(第8.4.5节),否则会发生编译时错误.

此规则允许协变返回类型 - 在覆盖方法时优化方法的返回类型.

因此,即使该方法隐藏了一个超类并且没有覆盖它,返回类型仍必须兼容.