11

当我看到像这样的代码片段时

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

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

4

5 回答 5

35

我们需要这个,因为它会让 Scala 的人大发雷霆。它们已经以“特征”的形式具有相当相似的功能,因此现在他们必须使这些功能与它们一起工作。

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

于 2012-01-26T21:32:48.290 回答
13

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

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

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

有关扩展方法提案的更多信息,请参见Java Enhancement Proposal 126

于 2012-01-26T22:40:52.460 回答
7

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

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

于 2012-02-03T14:33:12.740 回答
3

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

于 2012-01-26T22:15:18.923 回答
-1

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

于 2012-01-26T21:29:17.367 回答