编辑:从Java 8开始,静态方法现在被允许出现在接口中。

下面是例子:

public interface IXMLizable<T>
{
  static T newInstanceFromXML(Element e);
  Element toXMLElement();
}

当然这行不通。但为什么不呢?

其中一个可能的问题是,当你调用:

IXMLizable.newInstanceFromXML(e);

在这种情况下,我认为它应该只调用一个空方法(即{})。所有子类都必须实现静态方法,所以在调用静态方法时它们都没问题。那为什么不可能呢?

编辑:我想我正在寻找比“因为这就是Java”更深刻的答案。

静态方法不能被覆盖是否有特殊的技术原因?也就是说,为什么Java的设计者决定让实例方法可重写,而不是静态方法?

编辑:我的设计的问题是我试图使用接口来执行编码约定。

也就是说,接口的目标有两个:

我希望IXMLizable接口允许我将实现它的类转换为XML元素(使用多态性,工作正常)。 如果有人想创建实现IXMLizable接口的类的新实例,他们总是知道会有一个newInstanceFromXML(Element e)静态构造函数。

除了在界面中添加注释之外,还有其他方法可以确保这一点吗?


当前回答

让我们假设在接口中允许使用静态方法: *它们将强制所有实现类声明该方法。 *接口通常是通过对象来使用的,所以唯一有效的方法是非静态方法。 *任何知道特定接口的类都可以调用它的静态方法。因此,实现类的静态方法将在下面被调用,但调用方类不知道是哪个。怎么知道呢?它没有实例化来猜测!

接口被认为是在处理对象时使用的。这样,对象就从一个特定的类实例化了,所以最后一个问题就解决了。调用类不需要知道具体是哪个类,因为实例化可能由第三个类完成。因此调用类只知道接口。

If we want this to be extended to static methods, we should have the possibility to especify an implementing class before, then pass a reference to the invoking class. This could use the class through the static methods in the interface. But what is the differente between this reference and an object? We just need an object representing what it was the class. Now, the object represents the old class, and could implement a new interface including the old static methods - those are now non-static.

元类就是为此目的服务的。你可以试试Java的class。但问题是Java在这方面不够灵活。不能在接口的类对象中声明方法。

这是一个元问题-当你需要做屁股

..等等等等

不管怎样,你有一个简单的解决方法——用相同的逻辑使方法非静态。但是,您必须首先创建一个对象来调用该方法。

其他回答

静态方法不像实例方法那样是虚拟的,所以我猜想Java设计者决定不让它们出现在接口中。

但是您可以将包含静态方法的类放在接口中。你可以试试!

public interface Test {
    static class Inner {
        public static Object get() {
            return 0;
        }
    }
}

随着Java 8的出现,现在可以在接口中编写默认方法和静态方法。 docs.oracle / staticMethod

例如:

public interface Arithmetic {

    public int add(int a, int b);

    public static int multiply(int a, int b) {
        return a * b;
    }
}
public class ArithmaticImplementation implements Arithmetic {

    @Override
    public int add(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        int result = Arithmetic.multiply(2, 3);
        System.out.println(result);
    }
}

结果:6

提示:调用静态接口方法不需要由任何类实现。当然,这是因为适用于超类中的静态方法的规则同样适用于接口上的静态方法。

Why can't I define a static method in a Java interface?

接口中的所有方法都是显式抽象的,因此不能将它们定义为静态方法,因为静态方法不能抽象。

接口只是提供一个类将提供的东西的列表,而不是这些东西的实际实现,这就是你的静态项。

如果你想要静态,使用一个抽象类并继承它,否则,删除静态。

希望有帮助!

可以实现的是静态接口(而不是接口中的静态方法)。实现给定静态接口的所有类都应该实现相应的静态方法。你可以从任何Class clazz中获得静态接口SI

SI si = clazz.getStatic(SI.class); // null if clazz doesn't implement SI
// alternatively if the class is known at compile time
SI si = Someclass.static.SI; // either compiler errror or not null

然后你可以调用si.method(params)。 这将很有用(例如对于工厂设计模式),因为您可以从编译时未知类获得(或检查)SI静态方法实现! 动态分派是必要的,您可以通过扩展类(当通过静态接口调用时)来重写类的静态方法(如果不是final方法)。 显然,这些方法只能访问它们类的静态变量。