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
显然是相互矛盾的关键字,但是默认关键字本身并没有严格要求,因此我假设这种矛盾是有意为之,以反映“带有主体的类方法”(正义方法)和“接口”之间的细微差别。带主体的方法”(默认方法),即我尚未理解的差异。
在一定的时间点,对于像修饰符的支持static
和final
接口方法上还没有充分探讨,援引布赖恩戈茨:
另一部分是我们要在接口中支持类构建工具的程度,例如最终方法,私有方法,受保护的方法,静态方法等。答案是:我们尚不知道
从2011年末开始,很明显,static
增加了对接口方法的支持。显然,这为JDK库本身增加了很多价值,例如with Comparator.comparing()
。
题:
是什么原因final
(也static final
没有)没有使用Java 8接口?
final
防止方法被覆盖,并看到您必须如何覆盖从接口继承的方法,我不明白为什么将其定型是有意义的。除非要表明该方法在重写一次之后才是最终方法,否则会存在困难吗?如果我不了解这项权利,请让我知道。似乎很有趣
final
可以用于防止实现类覆盖接口方法的默认实现。