更改Java接口后客户端是否必须重新编译?

更改Java接口后客户端是否必须重新编译?,java,interface,Java,Interface,我在API中有一个Java接口,其中包含一个方法: public interface MyInterface { public void foo(); } 如果我向该接口添加如下方法: public interface MyInterface { public void foo(); public void bar(); } 使用API的客户端是否需要重新编译,或者他们是否可以按原样使用新的JAR,因为我没有更改签名、现有方法或删除方法?简短回答:客户端可以使用新的A

我在API中有一个Java接口,其中包含一个方法:

public interface MyInterface
{
    public void foo();
}
如果我向该接口添加如下方法:

public interface MyInterface
{
    public void foo();
    public void bar();
}

使用API的客户端是否需要重新编译,或者他们是否可以按原样使用新的JAR,因为我没有更改签名、现有方法或删除方法?

简短回答:客户端可以使用新的API而无需重新编译

下面是一个可以帮助您理解Java如何运行字节码以及它如何进行动态链接的示例。

这取决于具体情况

如果客户机要实现接口,那么客户机不仅需要重新编译,还必须首先在其实现类中实现新方法


如果客户端只使用接口(作为对在系统中创建的对象的引用),则客户端不必重新编译。

如果添加了方法,则如果从未使用该方法,则无需重新编译实现者。你为什么要这样做?如果您正在实现第三方接口,例如JDBC或JMS,并且添加了既不实现也不调用的方法,则无需重新编译

如果方法没有重载,则不需要重新编译调用方。但是,如果方法重载,调用方可能需要重新编译,因为它可能使用不同的方法调用

interface Methods {
    void method(double d);
    // adding a method
    void method(int i);
}

// calling code
Method methods = ...
methods.method(1);
在不重新编译的情况下,调用方将继续调用第一个方法,但是在重新编译后,调用方将调用第二个方法

如果删除未调用的方法,也可以

重命名方法与删除旧方法并添加新方法相同


如果更改所用方法的参数类型或返回类型,则需要重新编译。

我认为运行时类验证程序会在这一点上中断,既然声称实现接口的现有类没有……那么库的客户端是否有一个类实现了更改后的接口呢?@BoltClock:op提到他/她正在使用接口,而不是实现它。@BoltClock2如果客户端没有更改,那么他们将永远不会调用未实现的方法。因此没有问题。@antlersoft:如果有一个类实现了更改后的接口,当然需要重新编译它。链接的材料非常好;谢谢你指出!(对于其他人,它引用的学术论文基本上是相同的核心材料,但没有所有的打字错误,尽管它缺少HTML版本中的许多扩展示例。)