我不明白为什么在尝试编译此代码时编译器会显示错误:
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;
}
}
A和B类中两个方法之间的区别是返回类型,我读到Java可以防止覆盖静态方法。因此,我期望的是编译器不应显示任何错误,因为本来没有任何替代!
在Java语言规范有以下规则:
8.4.8.3。覆盖和隐藏要求
如果返回类型为R1的方法声明d1覆盖或隐藏了返回类型为R2的另一个方法d2的声明,则d1必须是d2的返回类型可替代的(第8.4.5节),否则会发生编译时错误。
此规则允许使用协变返回类型-在覆盖方法时优化方法的返回类型。
因此,即使该方法隐藏了父类之一并且没有覆盖它,返回类型也必须兼容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句