对于以扩展类型作为第一个参数的静态方法,C#扩展方法只是语法糖。Java默认方法完全不同。要模仿C#扩展方法,只需编写常用的静态方法。但是,您将不会食用合成糖。Java没有此功能。
Java默认方法是真正的虚拟方法。例如,它们可以被覆盖。考虑
X从
I声明默认
foo()方法的接口继承的类。如果
X或其任何超类未声明自己的
foo()方法,
X则将获取的
foo()实现
I。现在,子类
Y的
X可以覆盖
X.foo()像通常的方法。因此,默认方法不仅是语法糖。它们是方法覆盖和继承机制的真正扩展,其他语言功能无法模仿。
默认方法甚至需要特殊的VM支持,因此它们甚至不只是编译器功能:在类加载期间,必须检查类的层次结构以确定它将继承哪些默认方法。因此,此决定是在运行时而不是在编译时做出的。很棒的事情是,当继承的接口获得新的默认方法时,您不必重新编译类:VM将在类加载时将新方法分配给它。



