Java 8:虚拟扩展方法与抽象类

2022-09-01 11:53:40

我正在研究Java 8接口中新的虚拟扩展方法:

public interface MyInterface {
   default String myMethod() { 
      return "myImplementation"; 
   }
}

我明白他们的目的是允许接口随着时间的推移而发展,以及多重继承位,但它们对我来说非常像一个抽象类。

如果您正在从事新的工作,那么抽象类是否优于扩展方法,以便为“接口”提供实现,或者这两种方法在概念上是等效的?


答案 1

此类构造的一个主要目的是保持向后兼容性。在Java语言中添加闭包是一个相当大的变化,需要更新才能充分利用这一点。例如,Java 8 中的 Collection 将具有与 lambdas 结合使用等方法。简单地将此类方法添加到预先存在的接口是不可行的,因为它会破坏向后兼容性。我用Java 7实现编写的类将不再编译,因为它将缺少这些方法。因此,这些方法是通过“默认”实现引入的。如果你了解Scala,你可以看到Java s正变得越来越像Scala。forEach()CollectionCollectioninterfacetrait

至于接口与抽象类,两者在Java 8中仍然不同;例如,您仍然不能在接口中使用构造函数。因此,这两种方法本身并不“概念上等同”。抽象类更具结构化,可以具有与它们关联的状态,而接口则不能。您应该使用在程序上下文中更有意义的方法,就像在Java 7及以下版本中所做的那样。


答案 2

抽象类保存状态(实例字段),以便提供一些常见的行为(方法)。
你通常不会(从来没有?)看到一个没有状态的抽象类。

接口指定功能。它们旨在将行为声明为契约,而不是实现它。
因此,任何被指定为接口一部分的方法都是“帮助器”方法——它们不会影响实现。