我有一个公共 API,在多个项目中多次使用:
public interface Process<C extends ProcessExecutionContext> {
Future<?> performAsync(C context);
}
以及一个负责实现 Future 机制的抽象类(未显示)。我知道所有项目都是相应抽象类的子类(对于它 performAsync 是final),并且没有一个类在没有抽象实现者的子类的情况下实现抽象接口。这是设计使然,因为这个“公共”API 在我们公司内部是“公共的”。
与 Spring 相比,发现这Future
太有限了,ListenableFuture
我决定将接口扩展到
public interface Process<C extends ProcessExecutionContext> {
ListenableFuture<?> performAsync(C context);
}
而且我已经在示例中未显示的单个抽象超类中实现了 ListenableFuture。根据设计,不存在其他实现。
到目前为止,每个调用者都Future
使用ListenableFuture
. 如果您使用Future<?> future = processReturningListenable.performAsync(context)
.
问题是:如果我部署了公共 API 的最新 JAR,包含接口和抽象超类,并ListenableFuture
在现有环境中实现,而不重新编译所有项目,performAsync
调用是否仍然有效?
即当接口被替换为返回原始类型的子类型的方法时,Java 是否授予接口的二进制兼容性?
我问这个是因为 1)我发现没有人可以使用现有的 JAR 文件进行简单测试,并且 2)必须重新编译所有项目是一个红色警报。
我假设我的要求是可能的,因为 Java 方法名称由计算方法名称和输入参数的签名标识。更改输出参数不会更改方法的名称