2

我正在尝试更改 Proj2 中的界面。但是,Proj1 已经在使用这个接口,并且不会与我的新版本一起编译。

看起来只有当我更改/删除现有方法但添加新方法似乎不会导致任何问题时才会出现问题。

因此,只要我只向接口“添加”方法,我就可以期待 Proj1 与最新的 Proj2 Jar 兼容。

这是一个坚如磐石的安全假设吗?

更新:接口和 impl 都驻留在 proj2 中。Proj1 没有该接口的实现。

4

4 回答 4

3

通过“使用”,您的意思是“使用接口引用对象并使用该引用调用接口定义的方法”,而不是“实现接口”(是的,您已经在评论中澄清了,但我只想重复一遍,因为所有其他答案是关于实现接口)。

在这种情况下,只要您没有从接口中删除方法或更改其签名,您现有的代码就可以工作。

这将起作用的原因是编译器将方法调用转换为调用接口字节码,该字节码通过名称引用接口类和方法。在运行时,JVM 只是验证实际引用是否实现了接口,并调用方法。

如果删除更改引用的接口方法,将发生以下两种情况之一:JVM 将拒绝加载 proj1 中的类,因为无法解析接口引用,或者它会给出一个NoSuchMethodError(我相信是第二个) . 如果您删除或更改具体类中的引用方法,也是如此。

于 2012-09-07T17:01:26.927 回答
3

不可以。向接口添加新方法或更新其当前签名将要求您在已实现接口的类中提供这些方法的实现。

但是,当您从接口中删除特定方法声明时,即使它是在实现该接口的类中定义的,也不会产生任何影响。删除的方法只是作为类的普通方法,不再与接口的现有契约绑定。

我能想到的解决您的问题的唯一方法是利用 Java 让您为给定的类实现多个接口。你应该尝试做的是创建一个新接口,在这里定义你的新方法,让你在 proj2 中的类也实现这个接口。这样,当您打包新 jar 时,proj1 中现有的类将不受影响。

于 2012-09-07T16:42:25.733 回答
2

如果您只是添加方法,请创建第二个接口。Java 类可以实现多个接口。这样,实现 Interface1 的类保持不变。

您较新的类实现接口 Interface1 和 Interface2。

于 2012-09-07T16:47:11.317 回答
0

你会得到错误:

The type XXXImpl must implement the inherited abstract method IXXX.method()
于 2012-09-07T16:46:15.343 回答