2

我需要在 Java 中进行一些重构,并且需要保持一定程度的二进制兼容性。在这种情况下,我想删除一些旧接口,这些接口不再在任何地方使用,并且需要相当大的(并且不推荐使用的)外部依赖项。

我有C实现 interface的类I,并且我有在C. 调用代码知道它正在使用C,而不仅仅是接口。

 class C implements I {
      void theMethod(){} ; // is declared in the interface I
 }

 C object;
 object.theMethod();

当我从类定义中删除接口(但保留所有方法)时,调用代码(根本不引用接口)是否仍然有效(无需重新编译)?

4

3 回答 3

5

是的,它会起作用——只要它没有在I任何地方明确引用接口。

来自JLS:符号引用的解析

类或接口的二进制表示使用其他类和接口的二进制名称(第 13.1 节)象征性地引用其他类和接口及其字段、方法和构造函数

引用类ClientClass的字段/方法的类C不包含I对该类可能实现的接口的隐式引用。

于 2009-12-11T07:54:27.030 回答
2

只要类的对象C从未被称为I.

您还可以参考Evolving Java-based APIs part 2

于 2009-12-11T08:00:47.003 回答
1

如果调用代码在任何地方导入接口,您可能会遇到问题。如果import在任何调用代码中都没有接口,那么您可以有理由相信您的重构将按计划进行。

于 2009-12-11T08:00:14.710 回答