Với 1,2,3,4 bạn đang tạo int
literals. Trong khi chuyển chúng đến asList(T... a)
chúng được đóng hộp thành Integer
các đối tượng triển khai Comparable
(public final class Integer extends Number implements Comparable<Integer>
), để bạn có thể sắp xếp chúng.
Cập nhật
Bình luận: Có, nhưng danh sách được khai báo là Danh sách, vì vậy nó là từ đồng nghĩa với List<Object>
, không List<Integer>
, và Object
không thực hiện Comparable
.
Trả lời: Bạn không chỉ định loại chung cho danh sách và phương pháp Collections.sort()
chỉ kiểm tra xem lớp của đối tượng có mở rộng Comparable
hay không. Nếu danh sách không có loại, trình biên dịch của bạn chỉ nên cung cấp cho bạn một cảnh báo và mọi thứ sẽ hoạt động tốt vì Integer
có thể so sánh được.
Mã nguồn của cách sắp xếp
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]);
}
}
Cập nhật
Execute đoạn mã này để xem những gì sẽ xảy ra nếu lớp không thực hiện 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);
}
}
Dàn diễn viên để Comparable
đó được thực hiện trong dòng 290 của ComparableTimSort.class
sẽ thất bại!
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)
Vì bạn đang sử dụng Java 8, vui lòng sử dụng * generics *: 'List nums', cũng trả lời câu hỏi của bạn. –
Andreas
Bạn không thể có một Bộ sưu tập nguyên thủy trong Java, vì vậy chúng được tự động đóng vào loại tương đương của chúng. 'int' được tự động đóng hộp thành' Integer' mà DOES thực hiện so sánh. – McNultyyy
Cuối cùng, chúng chỉ là đối tượng khi được thêm vào danh sách. Các đối tượng lớp nguyên là chúng. Lớp Integer thực hiện giao diện tương đương. Vì vậy, cuối cùng của nó Integer, không chỉ Object – SacJn