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

问题描述 投票:-4回答:2

这里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);
    }
}
java sorting arraylist comparator comparable
2个回答
1
投票

看看sort#方法的签名

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

这意味着没有列表应该实现Comparable能够排序,但列表元素的类型。

在你的情况下String实现Comparable,所以代码编译和运行没有异常


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
© www.soinside.com 2019 - 2024. All rights reserved.