移除Java类中冗余父接口是否会破坏二进制兼容性?
关于移除冗余implements声明的二进制兼容性问题
结论
移除class A上的implements I冗余声明会破坏二进制兼容性。
具体原因
- 核心问题出在反射API的行为变化:
- 当A显式声明实现I时,调用
A.class.getFields()会返回接口I里的公共静态常量F; - 删掉这个声明后,A只是通过父类B间接实现I,这时候
A.class.getFields()就不会再包含I中的F字段了。
- 当A显式声明实现I时,调用
- 如果已有代码依赖从A的反射结果里获取
F,移除声明后这些代码要么抛出NoSuchFieldException,要么出现逻辑错误,直接导致兼容性问题。
额外说明
从Java语法和编译角度来说,移除这个冗余声明不会影响A对I中字段或方法的正常访问——毕竟A可以通过B继承I的相关内容。但反射行为的差异,会让依赖反射的代码出现问题,这也是为什么说二进制兼容性被破坏了。
内容的提问来源于stack exchange,提问作者Andreas Mueller
相关产品推荐
相关产品推荐

