此处 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);
}
}
答案 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