为什么实现类不能将覆盖方法定义为静态?

Kid*_*mpo 3 java inheritance static static-methods interface

我很困惑为什么不允许以下内容:

public interface MyInterface {
  MyInterface getInstance(String name);
}

public class MyImplementation implements MyInterface {
  public MyImplementation(String name) {
  }
  @Override
  public static MyInterface getInstance(String name) { // static is not allowed here
    return new MyImplementation(name)
  }
}
Run Code Online (Sandbox Code Playgroud)

我理解为什么接口中的方法不能是静态的,但为什么不能覆盖这个方法呢?

我希望所有类都实现该getInstance(String name)方法,但是我目前仅限于只有在对象已经被实例化时才能调用该方法哪种类型会失败...


*更新:*感谢您的回答,我现在明白了.基本上我不应该试图使实用程序类(或工厂类)实现一个接口(或至少,不是这样)...

das*_*ght 9

在Java中调用静态方法需要您指定确切的类型.无法以多态方式调用静态方法,无需使用@Override.

请注意,这种方法并非在所有语言中都是通用的:例如,您可以覆盖Objective-C中的类方法,Apple的cocoa框架可以充分利用这种机制来自定义它们的"工厂"类.但是,在Java,C++和C#类方法中,不支持多态行为.

从理论上讲,Java设计人员可以让您通过static方法提供接口方法实现,以防实现不需要从实例访问状态.但是使用一个简单的包装器可以很容易地实现相同的行为:

public class MyImplementation implements MyInterface {
    public MyImplementation(String name) {
    }
    @Override
    public MyInterface getInstance() { // static is not allowed here
        return getInstanceImpl();
    }
    public static getInstanceImpl() {
        return new MyImplementation(name)
    }
}
Run Code Online (Sandbox Code Playgroud)

Java编译器本可以代表你做同样的事情,但是看到静态方法实现实例方法既不寻常又令人困惑,所以我的猜测是Java设计者决定不提供这种"神奇的".