【Java8】默认方法

摘抄自 《Java8实战》

Java 8中加入默认方法主要是为了支持库设计师,让他们能够写出更容易改进的接口。这一方法很重要,因为你会在接口中遇到越来越多的默认方法,但由于真正需要编写默认方法的程序员相对较少,而且它们只是有助于程序改进,而不是用于编写任何具体的程序,我们这里还是不要啰嗦了,举个例子吧。

List<Apple> heavyApples1 = inventory.stream().filter((Apple a) -> a.getWeight() > 150).collect(toList());

List<Apple> heavyApples2 = inventory.parallelStream().filter((Apple a) -> a.getWeight() > 150).collect(toList());

但这里有个问题:在Java 8之前, List 并没有 stream 或 parallelStream 方法,它实现 Collection 接口也没有,因为当初还没有想到这些方法嘛!可没有这些方法,这些代码就不能编译。换作你自己的接口的话,最简单的解决方案就是让Java 8的设计者把 stream 方法加入 Collection 接口并加入 ArrayList 类的实现。

可要是这样做,对用户来说就是噩梦了。有很多的替代集合框架都用Collection API实现了接口。但给接口加入一个新方法,意味着所有的实体类都必须为其提供一个实现。语言设计者没法控制 Collections 所有现有的实现,这下你就进退两难了:你如何改变已发布的接口而不破坏已有的实现呢?Java 8的解决方法就是打破最后一环——接口如今可以包含实现类没有提供实现的方法签名了!那谁来实现它呢?缺失的方法主体随接口提供了(因此就有了默认实现),而不是由实现类提供。这就给接口设计者提供了一个扩充接口的方式,而不会破坏现有的代码。Java 8在接口声明中使用新的 default 关键字来表示这一点。

例如,在Java 8里,你现在可以直接对 List 调用 sort 方法。它是用Java 8 List 接口中如下所示的默认方法实现的,它会调用 Collections.sort 静态方法:

default void sort(Comparator<? super E> c) {
	Collections.sort(this, c);
}

这意味着 List 的任何实体类都不需要显式实现 sort ,而在以前的Java版本中,除非提供了sort 的实现,否则这些实体类在重新编译时都会失败。不过慢着,一个类可以实现多个接口,不是吗?那么,如果在好几个接口里有多个默认实现,是否意味着Java中有了某种形式的多重继承?是的,在某种程度上是这样。Java 8用一些限制来避免出现类似于C++中臭名昭著的菱形继承问题。

发布了107 篇原创文章 · 获赞 88 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/Code_shadow/article/details/103099317