首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8:虚拟扩展方法与抽象类

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

Stack Overflow用户
提问于 2013-08-12 23:51:50
回答 5查看 12.3K关注 0票数 30

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

代码语言:javascript
复制
public interface MyInterface {
   default String myMethod() { 
      return "myImplementation"; 
   }
}

我实现了他们的目的,允许一个接口随着时间的推移而发展,以及多重继承位,但在我看来,它们看起来非常像一个抽象类。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-13 00:04:27

这种构造的一个主要目的是保持向后兼容性。在Java语言中添加闭包是一个很大的改变,需要进行更新才能充分利用这一点。例如,Java8中的Collection将具有与lambdas一起工作的方法,如forEach()。简单地将这些方法添加到预先存在的Collection接口是不可行的,因为它会破坏向后兼容性。我用Java7编写的实现Collection的类将不再编译,因为它将缺乏这些方法。因此,这些方法是通过“默认”实现引入的。如果您了解Scala,您可以看到Java的interface正在变得更像Scala trait的。

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

票数 34
EN

Stack Overflow用户

发布于 2013-08-13 00:02:57

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

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

票数 5
EN

Stack Overflow用户

发布于 2013-08-13 00:39:21

抽象类保存状态(实例字段),以提供一些常见的行为(方法)。

你不是典型的(从来没有?)查看没有状态的抽象类。

接口指定功能。它们的目的是将行为声明为合同,而不是实施它。

因此,指定为接口一部分的任何方法都是“助手”方法--它们不影响实现。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18198517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档