自Java 8以来,接口中的静态方法开始出现。它们使用关键字static声明,并直接在接口中实现。实现类不会继承静态方法,而是通过接口名称调用。
interface MathUtils { static int sum(int a, int b) { return a + b; } }
MathUtils.sum(1, 2);**问题:**接口的静态方法可以通过实现类的对象调用吗?
**回答:**不可以,接口的静态方法总是通过接口名称调用,而不是通过实例或实现类名称。以下示例将引发编译错误:
MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // 错误!需要 MathUtils.sum(1, 2)
故事
开发者错误地尝试在实现类中“重写”接口的静态方法,并期望通过实例调用该方法。结果始终调用接口中的版本,导致使用时业务逻辑错误。
故事
在将工具方法从类迁移到接口时,部分代码使用了通过对象调用:
obj.method(),这变得不可能,必须在整个项目中对调用进行重构,改为InterfaceName.method()。
故事
对旧版本Java的支持导致在添加静态方法到接口后发生编译错误,开发者没有检查CI中使用的编译器版本,导致构建频繁失败。