繁体   English   中英

是否有任何注释来警告子类不应在Java中隐藏静态方法

[英]Is there any annotation to warn that subclasses shouldn't hide a static method in Java

我有一个包含Java公共静态方法的类。 Java中是否有任何注释来警告子类不要使用相同的方法签名(从而隐藏超类方法)。 任何其他解决方法也可以。

只需将超类方法定为final

class Foo {
    public static final void go() {}
}

class Bar extends Foo {
    public static void go() {};  // Error
}

理想的例子

您不需要这样的注释,因为您在不进行编译时试图做的事情...

在Java中,您无法覆盖静态方法


如@thomas建议(+1 dafuer),您可以使用静态方法示例的可见性:

public class Calculator {

    static int add(int a, int b) {
        System.out.println("a+b= " + (a + b));
        return a + b;
    }

    public static void main(String[] args) {

    }
}

接着

public class ScientificCalculator extends Calculator {

    public int add(int a, int b) {
        System.out.println("11111");
        return a + b;
    }

}

我不知道任何这样的注释来标记方法的声明。 但是,您可以从相反的方向进行处理。 您不必关注方法声明,而可以查看它的用法。 -Xlint:all将警告是否有任何用途。 具有与其父类中的静态方法相同的签名的静态方法仅在从实例而非静态引用该方法时才引起问题。 考虑以下示例:

public class Foo {

  public static String getFoo(){
    return "foo";
  }
}

public class Bar extends Foo {

  public static void main(String[] args){

    Bar bar = new Bar();
    String s = bar.getFoo(); // Actually calls Foo.getFoo()
    System.out.println(s); // Prints "foo"

   }
}

在上面的代码中,我们通过Bar的实例引用了Foo的静态getFoo()方法。 bar.getFoo()行实际上是从Foo调用静态方法的。 现在假设我们向Bar添加一个具有相同签名的静态方法:

public class Bar extends Foo {
   public static String getFoo(){
      return "bar";
   }

  public static void main(String[] args){

    Bar bar = new Bar();
    String s = bar.getFoo(); // Actually calls Bar.getFoo()
    System.out.println(s); // Prints "bar"

   }
}

这从Bar隐藏了Foo.getFoo()方法,现在Bar.getFoo()调用Bar.getFoo()方法。 在实际情况下,这几乎肯定会破坏Bar 如果使用-Xlint:all选项进行编译,则会收到以下消息:

warning: [static] static method should be qualified by type name, Foo, instead of by an expression

您在编译Bar的第一个版本时会注意到这一点,可以立即将其修复为String s = Foo.getFoo() 稍后将getFoo也添加到Bar ,原始代码仍然可以使用,因为它显式引用了Foo的方法。 如果您总是通过引用声明了静态方法的类来显式调用静态方法,则在子类中具有相同方法的唯一问题是,这并非最佳实践。 也许也有一种方法来标记声明,但是我将集中精力确保正确使用静态方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM