这里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);
}
}
看看sort#方法的签名
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
这意味着没有列表应该实现Comparable能够排序,但列表元素的类型。
在你的情况下String实现Comparable,所以代码编译和运行没有异常
首先,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