Java 8在接口上引入了默认和静态方法。因此,现在您可以在接口中使用具体的实现,无论是使用默认方法还是静态方法。
Java声称添加这两种新方法的原因是“确保二进制兼容为这些接口的旧版本编写的代码”。
我的问题是:
发布于 2015-05-02 09:07:35
java声称添加这2种新方法的原因是“确保二进制与为这些接口的旧版本编写的代码的兼容性”。
这仅适用于默认方法(不适用于静态方法),并忽略了某些上下文。来自Goetz,兰博达州
默认方法的目的..。使接口能够在初次发布后以兼容的方式发展。
其主要目标是允许接口进化,即添加新方法。如果将新方法添加到接口中,则实现接口的现有类将缺少实现,这将是不兼容的。为了兼容,实现必须来自某个地方,因此它是由默认方法提供的。
为支持现有的体系结构问题,为什么要扭曲本应完全抽象的接口原始概念?
Java接口的主要目的是实现指定合同,任何类都可以实现,而不必更改其在类层次结构中的位置。的确,在Java 8之前,接口纯粹是抽象的。但是,这并不是接口的基本属性。即使包含默认方法,它的核心接口仍然在实现类上指定契约。实现类可以覆盖默认方法,因此该类仍然完全控制其实现。(还请注意默认方法不能是最终方法。.)
除了类扩展多个接口的能力之外,使用抽象类与新版本的接口有什么不同?
类扩展多个接口的能力与接口和抽象类之间的另一个区别密切相关,即接口不能包含状态。这是允许多重继承的主要困难:如果一个超类在类的祖先中多次出现,那么该超类的状态是只出现一次还是几次?(这就是所谓的“钻石问题”)
另一个不同之处是,通过使用受保护和包私有访问级别,抽象类可以定义要与子类共享的方法和字段,但不能与调用方共享。接口只能有公共方法。
(在Java 9中,增加了对私有方法的支持。这对于接口的默认或静态方法之间的实现共享非常有用。)
最后,接口中的静态方法不影响类继承,也不影响接口的契约。它们只是以更方便的方式组织实用方法的一种方式。例如,接口中常用的静态方法是静态工厂方法。如果接口中不允许使用静态方法,那么静态工厂方法就必须放在一个伴生类上。允许在接口中使用静态方法可以在适当的情况下将这些方法与接口本身进行分组。
https://stackoverflow.com/questions/29997052
复制相似问题