我需要在Java中进行一些重构,并且需要保持一定程度的二进制兼容性。在这种情况下,我想删除一些遗留接口,这些接口不再在任何地方使用,并且需要相当大的(也不推荐使用)外部依赖。
我有实现接口I的类C,还有调用C实例上的方法(在接口中声明的)的代码。调用代码知道它正在使用C,而不仅仅是接口。
class C implements I {
void theMethod(){} ; // is declared in the interface I
}
C object;
object.theMethod();当我从类定义中删除接口(但保留所有方法)时,调用代码(根本不引用接口)是否仍然有效(无需重新编译)?
发布于 2009-12-11 15:54:27
是的,只要它不显式地引用接口I anywhere,它就可以工作。
来自JLS: Resolution of Symbolic References
类或接口的二进制表示使用其他类和接口的二进制名称(§13.1)以符号方式引用其他类和接口及其字段、方法和构造函数
引用类C的字段/方法的类ClientClass不包含对该类可能实现的接口I的隐式引用。
发布于 2009-12-11 16:00:47
只要C类的对象从未被称为I,它就可以工作。
你也可以参考Evolving Java-based APIs part 2。
发布于 2009-12-11 16:00:15
如果调用代码在任何地方导入接口,那么它可能会出现问题。如果在任何调用代码中都没有接口的import,那么您可以有理由相信您的重构将按计划工作。
https://stackoverflow.com/questions/1886489
复制相似问题