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

时间:2012-01-26 20:57:38

标签: java interface multiple-inheritance java-8 diamond-problem

当我看到像

这样的代码片段时
  interface A {
      void a();
      void b() default { System.out.println("b"); };
      void c() final { System.out.println("c"); };
  }

我有一个问题。 我们在Java中已经没有足够的sh * t了吗?为什么有人需要这个?

5 个答案:

答案 0 :(得分:36)

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

小便Scala家伙实际上是Java语言开发中的最高优先级。

答案 1 :(得分:13)

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

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

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

有关扩展方法提案的详细信息,请访问Java Enhancement Proposal 126

答案 2 :(得分:7)

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:-1)

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