apa*_*ana 5 java sorting list comparable comparator
我不明白为什么 List.sort() 没有没有比较器的版本的逻辑。
特别是我看到可以使用 null: 调用 List.sort
list.sort(null)
,并且它似乎使用自然顺序进行排序。
我注意到在我的 IDE Collections.sort() 调用 List.sort(null),所以我想知道为什么 List.sort 似乎是最近在 Java 8 中引入的没有没有比较器的简单版本,在许多病例是不需要的。
此外,我不确定在这种情况下是否最好调用 List.sort(null) 以避免额外调用,或者是否仍然首选调用 Collections.sort() 并避免丑陋的 null 参数。
这是一个设计决定,混合了一些历史原因。可以添加 alist.sort()
但它不能确保编译时的安全,只能确保运行时的安全。对于 JDK 来说,这将是一个相当奇怪和不寻常的设计。
集合,因为它可以在方法声明中指定类型边界,有可能强制Comparable
元素:
public static <T extends Comparable<? super T>> void sort(List<T> list)
Run Code Online (Sandbox Code Playgroud)
因此该方法可以确保集合包含Comparable
元素。所以 aComparator
是不需要的。
List
不能这样做。它的泛型类型必须允许一切,你必须能够使用 aList<Dog>
尽管那些可能不是Comparable
。
因此,如果有将是一个list.sort()
,那么这种方法将需要弄清楚列表泛型类型是否T
是Comparable
或不是。但是这些信息只在运行时出现,我们希望它在编译时出现,但为了一个好的设计。
因为这会导致糟糕的设计,list.sort()
不存在。因此,强制 a 的额外方法Comparator
可以确保编译时的安全性。
拥有list.sort(null)
而不是list.sort()
显然是一种设计选择,在我看来是一个很好的选择。如前所述,不可能List
在编译时确保安全。所以唯一的选择是运行时安全,这不是那么好。
拥有一个list.sort()
仅有时有效并引发异常的方法,否则将是一个奇怪的设计选择。list.sort(null)
然而,对于任何用户来说,这样的调用都更加清晰。特别是,更清楚的是,这将由运行时决策覆盖,而不是由编译时检查覆盖。
您可能希望使其明确并赋予它Comparator
使用自然排序的琐碎:
list.sort(Comparator.naturalOrder());
Run Code Online (Sandbox Code Playgroud)
这至少对读者来说会更清楚。
你现在可能想知道为什么List.sort(null)
even 是一个受支持的特性,为什么他们不要求你Comparator
总是给它一个明确的。我无法深入了解开发人员的想法,但我怀疑是历史原因。JDK中有不少类似的例子,尤其是排序方面。
这主要是因为 Java 保持了向后兼容性。泛型是在 Java 5 中引入的,所以之前存在的所有处理容器的东西在设计时都没有考虑到类型安全。
有几个高度相关的例子:
Arrays#sort(Object[])
(自 Java 1.2 起)不强制Comparable
. 因此,他们必须在 Java 5 中添加额外的重载Arrays.sort(T[], Comparator)
,就像List
示例一样。Collections.sort(T[], Comparator)
实际上接受null
比较器。一个糟糕的设计选择,但它是在泛型尚不存在的时候做出的。所以他们不能再删除这个功能了。List.sort(Comparator)
一种新方法也支持null
. 然而,在Stream.sort(Comparator)
他们没有。这是 JDK 中一个奇怪的不一致。 归档时间: |
|
查看次数: |
394 次 |
最近记录: |