我很困惑为什么不允许以下内容:
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) } }
我知道为什么接口中的方法不能是静态的,但是为什么覆盖方法不能是静态的?
我希望所有类都可以实现该getInstance(String name)方法,但目前仅限于如果已经实例化了该对象而无法调用该方法,则只能调用该方法…
getInstance(String name)
**_更新: _ 感谢您的回答,我现在对此有了更好的了解。基本上,我不应该尝试使实用程序类(或与此相关的工厂类)实现接口(或者至少不是这样)。
在Java中调用静态方法要求您指定确切的类型。无法多态调用静态方法,从而消除了对的需求@Override。
@Override
请注意,这种方法并非在所有语言中都通用:例如,您可以在Objective-C中覆盖 类方法 ,并且Apple的可可框架很好地利用了这种机制来自定义其“工厂”类。但是,在Java中,C ++和C#类方法不支持多态行为。
从理论上讲,static如果实现无需从实例访问状态,则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) } }
Java编译器可以代表您做同样的事情,但是看到静态方法实现实例方法既不寻常又令人困惑,因此我的猜测是Java设计人员决定不提供这种“魔力”。