为什么以下代码对对象列表进行排序?

sav*_*vak 17 java collections list object

你能否解释为什么下面的代码按预期编译和打印[1,2,3,4].我正在使用Java 8.

List nums = Arrays.asList(4, 3, 2, 1);
Collections.sort(nums);
System.out.println(nums);
Run Code Online (Sandbox Code Playgroud)

据我所知,这里创建了四个Integer实例.每个列表条目都包含对Integer实例的Object引用.由于Object类没有实现Comparable接口,因此Collections.sort应该抛出ClassCastException或类似的东西,因为它无法将Object引用强制转换为Comparable引用.

你能指出我错过了什么吗?

kai*_*kai 14

使用1,2,3,4创建int文字.在将它们传递给它们时,asList(T... a)它们被装入了Integer实现Comparable(public final class Integer extends Number implements Comparable<Integer>)的对象,因此您可以对它们进行排序.

更新

注释:是的,但List被声明为List,因此它是,但List<Object>不是List<Integer>,并且Object没有实现的同义词Comparable.

答:您没有为列表指定泛型类型,并且该Collections.sort()方法仅检查对象的类是否扩展Comparable.如果列表没有类型,你的编译器应该只给你一个警告,一切都应该正常工作,因为它Integer是可比较的.

排序方法的源代码

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    Object[] a = list.toArray();
    Arrays.sort(a);
    ListIterator<T> i = list.listIterator();
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set((T)a[j]);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新

执行这段代码,看看如果类没有实现会发生什么Comparable.

public class Test
{
    public static void main(String[] args)
    {
        List objs = new ArrayList<>();
        objs.add(new Test());
        objs.add(new Test());
        Collections.sort(objs);
    }
}
Run Code Online (Sandbox Code Playgroud)

Comparable在第290行完成的演员表ComparableTimSort.class将失败!

Exception in thread "main" java.lang.ClassCastException: src.Test cannot be cast to java.lang.Comparable
at java.util.ComparableTimSort.countRunAndMakeAscending(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at src.Test.main(Test.java:14)
Run Code Online (Sandbox Code Playgroud)

  • @savak`List`不是`List <Object>`的同义词.`List`基本上关闭所有通用功能.它适用于在泛型存在之前编写的代码.检查T扩展Comparable是在您不使用泛型时不会发生的检查之一. (3认同)