当我看到像这样的代码片段时
interface A {
void a();
void b() default { System.out.println("b"); };
void c() final { System.out.println("c"); };
}
我有一个问题。我们还没有在 Java 中得到足够的 sh*t 吗?为什么一个人可能需要这个?
当我看到像这样的代码片段时
interface A {
void a();
void b() default { System.out.println("b"); };
void c() final { System.out.println("c"); };
}
我有一个问题。我们还没有在 Java 中得到足够的 sh*t 吗?为什么一个人可能需要这个?
我们需要这个,因为它会让 Scala 的人大发雷霆。它们已经以“特征”的形式具有相当相似的功能,因此现在他们必须使这些功能与它们一起工作。
惹恼 Scala 家伙实际上是 Java 语言开发中的最高优先级。
Java 8 计划包含某种形式的 lambda 和闭包支持,这将是 Java 语言现代化的一大步。问题是现有的基于接口的库,如集合框架,将无法直接使用这些新特性。不可能在不破坏现有实现的情况下向接口添加方法,它们将不再编译。
拥有 lambda,但不能轻松地将它们与标准集合一起使用,对于 Java 开发人员来说将是一个巨大的失望。要将 lambdas 集成到标准集合中,非常需要使用forEach
、map
或之类的方法。filter
这个问题的解决方案是添加另一个特性,扩展方法,它定义了接口中方法的默认实现。现有的子类将使用默认方法,但也可以使用专门且可能更好的实现来覆盖该方法。
有关扩展方法提案的更多信息,请参见Java Enhancement Proposal 126。
我建议你看看这个会议: http: //medianetwork.oracle.com/media/show/16999
这解释了一切。最有趣的事情是在不重写整个代码库的情况下允许界面发展。这是允许大型代码库发展而不是变得越来越残缺的关键。
这很棒,因为它允许 API 编写者在不引起 NoSuchMethodErrors 的情况下事后扩展接口。它还为针对 V1 编译的类提供 V2 中方法的默认实现;代码就像一个魅力。这也允许您像往常一样覆盖针对 V2 编译的类中的默认实现,并使编号的接口变得多余。我认为它也优于使用站点扩展方法。
我相信“扩展方法”概念只不过是破解/修复暴露于“外部世界”的设计不佳的 API 的最后机会。只是语法糖。