【发布时间】:2020-10-14 12:10:54
【问题描述】:
Class Collections 有一些静态方法作为操作 List 等集合的实用程序。例如排序方法(Collections.sort(list))。我不明白为什么 Java 规范创建了另一个类来承载排序方法(以及所有其他方法,如 binarySearch)而不是 List 接口和具体的子类,如 ArrayList 和 LinkedList 实现这些方法。
更新
当我进行全球研究并阅读这篇文章的答案时,我不得不说(鸟瞰图): 有人(我提到@dan,@WJS,@cdalxndr)在这篇文章中说,以sort方法为例,因为ArrayList和LinkedList的排序可以用相同的方式完成,所以我们可以实现一次写入。所以(我说)我们可以将代码放在 List 接口中,但是在 Java 7 之前,我们不能将任何实现放在接口的主体中,并且有一次编写它的唯一方法是在实用程序类中实现。但是由于 Java 8 接口具有“默认”方法的特性。 Java 团队利用这个特性在接口级别实现了排序方法,并且该方法可以被 ArrayList 和 LinkedList 使用(默认情况下,如果类不覆盖它)
【问题讨论】:
-
@Steyrix 你误解了 Federicos 的评论。他并不是说 List 不是集合,而是说 Set 不是 List,因此当
sort()只存在于List接口面时,需要它们自己的声明和实现。 -
@FedericoklezCulloca 是的,很抱歉造成误解,我错过了您评论的意思:)
-
@Steyrix 这个问题是关于静态类
Collections而不是接口Collection。对集合操作的实用方法是问题的主题,继承不适用于此处。 -
@dan 好吧,我当时也误解了问题。但是,它仍然是关于称为多态性的 OOP 概念
-
不是每个 Collection 都可以排序,所以强制一个无法排序的 Collection 实现 sort() 方法可能被认为是不直观的设计。您当然可以指向 add() 方法,并且存在不支持添加的集合,并且该方法的实现只会抛出 unsupportedOperationException。我想最终它的设计选择是保持接口功能并且只有大多数实现也支持的方法,这样你就不会在所有方法中的 50% 只抛出异常的地方进行分类。
标签: java collections