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

Kon*_*ong 28 java abstract-class interface java-8

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

public interface MyInterface {
   default String myMethod() { 
      return "myImplementation"; 
   }
}
Run Code Online (Sandbox Code Playgroud)

我的目的是允许接口随着时间的推移而发展,以及多重继承位,但它们看起来非常像我的抽象类.

如果你正在做新的工作,抽象类优先于扩展方法来提供"接口"的实现,还是这两种方法在概念上是等价的?

ars*_*jii 33

这种结构的一个主要目的是保持向后兼容性.为Java语言添加闭包是一个很大的改动,需要更新一些内容才能充分利用这一点.例如,Collection在Java 8中将有诸如forEach()与lambda一起使用的方法.简单地将这些方法添加到预先存在的Collection接口是不可行的,因为它会破坏向后兼容性.我在Java 7实现中编写的类Collection将不再编译,因为它缺少这些方法.因此,这些方法是通过"默认"实现引入的.如果您了解Scala,您会发现Java interface变得更像Scala trait.

至于接口与抽象类,这两者在Java 8 中仍然不同 ; 例如,您仍然无法在界面中拥有构造函数.因此,这两种方法本身并不是"概念上等同的".抽象类更结构化,可以具有与之关联的状态,而接口则不能.您应该在程序的上下文中使用更有意义的内容,就像在Java 7及更低版本中一样.


aep*_*iet 5

  1. 抽象类不能是lambda表达式的根类,而具有虚扩展方法的接口可以是.
  2. 抽象类可以有构造函数和成员变量,而接口则不能.我相信它是一个可能的构造函数的执行,并且可能抛出一个禁止抽象类成为lambda表达式根的已检查异常.

如果要编写允许用户使用lambda表达式的API,则应使用接口.


Meh*_*dad 5

抽象类包含状态(实例字段),以便提供一些常见的行为(方法).
你通常不会(永远?)看到没有状态的抽象类.

接口指定功能.它们旨在将行为声明为合同,而不是实现它.
因此,任何指定为接口一部分的方法都是"辅助"方法 - 它们不会影响实现.