即将发布的Java 8版本中的虚拟扩展方法

当我看到代码片段之类的时候

interface A { void a(); void b() default { System.out.println("b"); }; void c() final { System.out.println("c"); }; } 

我有一个问题。 我们还没有得到足够的Java? 为什么人们可能需要这个?

我建议你看一下这个会议: http : //medianetwork.oracle.com/media/show/16999

这解释了一切。 最有趣的事情是允许接口进化而不重写整个代码库。 这是允许大型代码库发展而不是变得越来越残缺的关键。

我们需要这个,因为它会让Scala家伙非常愤怒。 它们已经具有“特征”形状的相似function,所以现在他们必须将这些function与这些function结合起来。

在Java语言开发中,Scala家伙的贬低实际上是最高优先级。

计划Java 8将包含某种forms的lambda和闭包支持,这将是Java语言现代化的重要一步。 问题是基于接口的现有库(如集合框架)将无法直接使用这些新function。 在不破坏现有实现的情况下,无法向接口添加方法,它们将不再简单地编译。

拥有lambdas但不能轻易地将它们与标准集合一起使用,对于Java开发人员来说将是一个巨大的失望。 要将lambda集成到标准集合中,非常需要像forEachmapfilter这样的方法。

此问题的解决方案是添加另一个function,即扩展方法,它定义接口中方法的默认实现。 现有的子类将使用默认方法,但也可以使用专门的,可能更好的实现来覆盖该方法。

有关扩展方法提议的更多信息,请参阅Java Enhancement Proposal 126 。

这很棒,因为它允许API编写器在不引起NoSuchMethodErrors的情况下进行post-hoc扩展接口。 它还为V2中针对V1编译的类提供了方法的默认实现; 代码就像一个魅力。 这也允许您像往常一样覆盖针对V2编译的类中的默认实现,并使编号的interfces冗余。 我认为它也优于使用站点扩展方法。

我相信“扩展方法”概念不过是破解/修复设计不佳的API的最后机会,这些API已经暴露于“外部世界”。 只是语法糖。