接口的默认方法

2025/06/05

一、背景

例如这个场景

  1. 最开始,你写了一个接口TestInterface这个接口中没有声明任何方法,是一个空接口

    public interface TestInterface {
    }
    
  2. 你根据这个空接口有一个实现类TestInterfaceImpl

    public class TestInterfaceImpl implements TestInterface {
        // 因为接口中没有声明任何方法,所以实现类自然也没有。
    }
    
  3. 陆陆续续这个接口下面实现了很多很多类。

  4. 现在想要对这个接口添加方法。如果在接口TestInterface中直接添加方法声明,会强制下面所有实现类全部都要实现方法

    public interface TestInterface {
        void methodA(); // 给接口添加方法声明,实现类TestInterfaceImpl也需要实现此方法
    }
    
  5. 使用 default 关键在接口中去声明方法,不会影响到先有实现类的功能

    public interface TestInterface {
        default void newExec() {}
    }
    

二、优点

  1. 向后兼容,不会导致兼容性的问题。已有的实现类无需实现此方法,可正常工作。
  2. 符合开闭原则:对扩展开放,对修改关闭。

三、现有框架例子

直接在spring源码中搜索default关键字的接口,你会发现很多这样使用的例子。最开始就是普通接口及接口方法的声明,后面有default关键字声明的方法。