如果不实现Comparable接口,则ArrayList的对象如何使用Collection.sort()而不出现错误?

时间:2018-09-03 07:19:31

标签: java sorting arraylist comparator comparable

此处 ArrayList 及其父级类和接口从未实现 Comparable ,仍然是 Collections.sort(al) 编译没有错误?

public class Collections_Demo {

    public static void main(String[] args) {

        ArrayList al= new ArrayList();
        al.add("ram");
        al.add("shaym");

        Collections.sort(al);
    }
}

2 个答案:

答案 0 :(得分:1)

查看sort#method的签名

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}

这意味着不是列表应该实现Comparable才能排序,而是列表元素的类型。

在您的情况下,String实现了Comparable,因此代码可以编译且运行时不会出事

答案 1 :(得分:0)

首先,ArrayList不必为Comparable。数组列表中的内容必须为Comparable。这是sort的签名:

public static <T extends Comparable<? super T>> void sort(List<T> list) {

T受约束,而不是List受约束。

但是,使用原始类型会改变一切。

因为您写的是ArrayList而不是ArrayList<String>,所以您使用的是ArrayList的原始类型。这基本上擦除了所有泛型类型参数,并使sort不检查任何约束。好像签名变成了:

public static void sort(List list) {

这就是为什么您可以调用它。如果您将非Comparable的东西放入数组列表,它将在运行时崩溃:

ArrayList al= new ArrayList();
al.add(new Object());
al.add(new Object());

Collections.sort(al); // ClassCastException