为什么不能实施类定义了一个压倒一切的方法静态?(Why can't implementing

2019-06-25 23:55发布

我很困惑,为什么以下是不允许的:

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)方法,但我目前仅限于能够调用该方法,如果对象已经被实例化哪一种失败的目的...


*更新:*谢谢你的答案,我现在好理解。 基本上我不应该试图使一个工具类(或工厂类为此事)实现一个接口(或者至少,不能以这种方式)...

Answer 1:

在Java中调用静态方法需要你指定的确切类型。 这是不可能的多态调用静态方法,省去了需要@Override

请注意,这种做法是不是在所有语言普遍的:例如,我们可以覆盖在Objective-C 类的方法 ,而苹果的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)
    }
}

Java编译器可以做代表你同样的事情,但看到一个静态方法实现的实例方法既不同寻常和混乱,所以我的猜测是,Java的设计者决定不提供这个“片神奇”。



Answer 2:

静态方法不能受到多态行为。 这将没有多大意义。 像这种使用情况下,假设你想会是什么可能:

public void foo(MyInterface i) {
    i.getInstance("abc");
}

现在我想调用此方法的实现MyInterface (类A ),但因为我不能把类本身,我需要传递一个对象:

A a = new A();
foo(a);

现在里面foostatic的超控getInstance被称为在类的实例A 。 所以,现在我坚持创建一个对象只是调用静态方法。

我的意思是,你仍然会受到限制,因为在原来的接口中的方法是一个实例方法来创建多态性的大多数使用情况的对象。



Answer 3:

因为实现接口使得实现者的接口的类型 。 这意味着实例需要有由类型,而不是类的实例的定义的方法。

换一种方式,

public void mymethod

public static void mymethod

是不一样的方法声明。 他们是完全不同的。 如果mymethod接口上定义的,具有第二定义简单地不满足实现该接口。



Answer 4:

答案归结为这是什么意思实现一个接口。 当一个类实现一个接口,也就是该类的每个实例会在每个界面响应方法承诺。 当您实现该方法为静态,你有可能要调用的方法类的实例-但是,这并不符合产业实现的承诺,该方法将在类的每个实例调用。



文章来源: Why can't implementing classes define an overriding method as static?