关于语言设计:为什么Java语言8接口方法中不允许使用”最终”?

Why is “final” not allowed in Java 8 interface methods?

Java 8最有用的特性之一是接口上的新的EDCOX1 0种方法。引入它们的原因主要有两个(可能还有其他原因):

  • 提供实际的默认实现。示例:Iterator.remove()
  • 允许JDK API的发展。示例:Iterable.forEach()

从API设计器的角度来看,我希望能够在接口方法上使用其他修饰符,例如final。这在添加方便方法、防止实现类中的"意外"重写时非常有用:

1
2
3
4
5
6
7
8
9
10
interface Sender {

    // Convenience method to send an empty message
    default final void send() {
        send(null);
    }

    // Implementations should only implement this method
    void send(String message);
}

如果Sender是一个类,则上述做法已经很常见:

1
2
3
4
5
6
7
8
9
10
abstract class Sender {

    // Convenience method to send an empty message
    final void send() {
        send(null);
    }

    // Implementations should only implement this method
    abstract void send(String message);
}

现在,defaultfinal显然是相互矛盾的关键字,但是默认关键字本身并不是严格要求的,所以我假设这个矛盾是故意的,以反映"类方法与体"(只是方法)和"接口方法与体"(默认方法)之间的细微差别,即不同的我还不明白的消费电子产品。

在某些时候,对接口方法上的修改器(如staticfinal)的支持还没有得到充分的探索,引用Brian Goetz的话:

The other part is how far we're going to go to support class-building
tools in interfaces, such as final methods, private methods, protected
methods, static methods, etc. The answer is: we don't know yet

显然,自2011年底以来,在接口中增加了对static方法的支持。显然,这为JDK库本身增加了很多价值,比如使用Comparator.comparing()

问题:

EDOCX1的3个原因(EDCOX1?12)为何没有达到Java 8接口的原因是什么?