为什么 Java 8 接口方法中不允许使用“最终”?
Java 8 最有用的特性之一是接口上的新方法。基本上有两个原因(可能还有其他原因)为什么引入它们:default
- 提供实际的默认实现。示例:
Iterator.remove()
- 允许 JDK API 演进。示例:
Iterable.forEach()
从API设计人员的角度来看,我希望能够在接口方法上使用其他修饰符,例如.这在添加方便的方法时非常有用,可以防止在实现类时发生“意外”重写:final
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
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);
}
现在,并且显然是矛盾的关键字,但是默认关键字本身并不是严格要求的,所以我假设这种矛盾是故意的,以反映“类方法与正文”(只是方法)和“接口方法与正文”(默认方法)之间的细微差异,即我还没有理解的差异。default
final
在某些时候,对接口方法等修饰符的支持尚未得到充分探索,引用Brian Goetz的话:static
final
另一部分是我们将在多大程度上支持接口中的类构建工具,例如最终方法,私有方法,受保护方法,静态方法等。答案是:我们还不知道
从2011年底开始,显然增加了对接口中方法的支持。显然,这为JDK库本身增加了很多价值,例如Compolarator.comparing()。
。static
问题:
是什么原因(以及)从未进入Java 8接口?final
static final