我正在查看Java 8接口中的新虚拟扩展方法:
public interface MyInterface {
default String myMethod() {
return "myImplementation";
}
}我实现了他们的目的,允许一个接口随着时间的推移而发展,以及多重继承位,但在我看来,它们看起来非常像一个抽象类。
如果您正在做新的工作,那么是抽象类优先于扩展方法来为“接口”提供实现,还是这两种方法在概念上是等价的?
发布于 2013-08-13 00:04:27
这种构造的一个主要目的是保持向后兼容性。在Java语言中添加闭包是一个很大的改变,需要进行更新才能充分利用这一点。例如,Java8中的Collection将具有与lambdas一起工作的方法,如forEach()。简单地将这些方法添加到预先存在的Collection接口是不可行的,因为它会破坏向后兼容性。我用Java7编写的实现Collection的类将不再编译,因为它将缺乏这些方法。因此,这些方法是通过“默认”实现引入的。如果您了解Scala,您可以看到Java的interface正在变得更像Scala trait的。
至于接口和抽象类,两者在Java 8中仍然不同;例如,在接口中仍然不能有构造函数。因此,这两种方法本身并不是“概念上等同的”。抽象类更结构化,可以具有与它们关联的状态,而接口则不能。您应该在程序的上下文中使用更有意义的内容,就像在Java 7和更低版本中所做的那样。
发布于 2013-08-13 00:02:57
如果您想要编写允许用户使用lambda表达式的API,则应该使用接口。
发布于 2013-08-13 00:39:21
抽象类保存状态(实例字段),以提供一些常见的行为(方法)。
你不是典型的(从来没有?)查看没有状态的抽象类。
接口指定功能。它们的目的是将行为声明为合同,而不是实施它。
因此,指定为接口一部分的任何方法都是“助手”方法--它们不影响实现。
https://stackoverflow.com/questions/18198517
复制相似问题