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)