我有一个公共的API,多次使用跨多个项目:我可以使用子接口重新编译公共API并保持二进制兼容性吗?
public interface Process<C extends ProcessExecutionContext> {
Future<?> performAsync(C context);
}
而且一个抽象类,负责实现未来的机制(未显示)。我知道,全部项目子类相应的抽象类(其中performAsync是最终)并没有单个类实现抽象接口没有子类抽象实现者。这是设计的,因为这个“公共”API在我们公司内是“公开”的。
查找有Future
相比,Spring的ListenableFuture
我决定将接口扩展到
public interface Process<C extends ProcessExecutionContext> {
ListenableFuture<?> performAsync(C context);
}
而且我已经在示例中未显示的一个抽象超类实现ListenableFuture过于限制。没有其他实现存在,通过设计。
到目前为止,每个呼叫者都使用Future
这是一个超级接口ListenableFuture
。如果您使用Future<?> future = processReturningListenable.performAsync(context)
,代码编译得很好。
问题是:如果我部署了公共API的跟上时代的JAR,含都接口与ListenableFuture
执行现有的环境,抽象超无需重新编译所有的项目,不performAsync
调用仍然有效?
I.e.当Java被一个返回原始类型的子类型的方法替换时,它授予接口的二进制兼容性吗?
我在问这是因为1)我发现没有人可用于使用现有的JAR文件进行简单测试,并且2)必须重新编译所有项目是红色警报。
我假设我所要求的是可能的,因为Java方法名是由计数方法名称和输入参数的签名标识的。改变输出参数不改变方法名
我不希望它在一个jar文件中有所作为 - 所以你应该可以用一个小应用程序(一个接口,一个实现,一个调用者;重新编译接口+实现,但不是来电者,看看它是否仍然有效)。 –
@Jon Skeet:不需要测试;它不以那种方式工作。 – Holger