2010-02-11 33 views
17

Tôi đã tự hỏi tại sao phương pháp sắp xếp của lớp Mảng là yêu cầu tham số kiểu Object []. Tại sao tham số không thuộc loại Comparable []. Nếu bạn không vượt qua một Comparable [] nó tạo ra một ClassCastException.Tại sao Arrays.sort lấy Object [] thay vì Comparable []?

Tại sao ... loại trống tĩnh công cộng (Object [] a) và không loại trống tĩnh công cộng (Có thể so sánh [] a)? Cảm ơn

+0

Bạn có cùng tình hình tại địa điểm khác trong api Java, ví dụ ObjectOutputStream mà hy vọng một đối tượng thực hiện Serializable. Tôi đoán, các nhà phát triển đã cố gắng để ngăn cản chúng tôi làm phôi không cần thiết. – ZeissS

+0

Quay trở lại trong ngày, có nhiều người thực hiện JDK, không chỉ là Mặt trời. Việc triển khai lớp có thể đã mong muốn Comparable, nhưng cho phép bất kỳ phân loại ổn định, xác định nào. (Hypothetically nói) – Kylar

Trả lời

8

Bởi vì hình thức thứ hai sẽ đòi hỏi việc phân bổ lại của mảng. Thậm chí nếu bạn biết rằng mảng của bạn chỉ chứa các giá trị so sánh, bạn không thể chỉ đưa nó vào Comparable [] nếu kiểu gốc là Object [], vì kiểu mảng không khớp.

Bạn có thể làm:

Object[] arr = new String[0]; 
String[] sarr = (String[]) arr; 

Nhưng bạn không thể làm:

Object[] arr = new Object[0]; 
String[] sarr = (String[]) arr; 

Vì vậy, nó tối ưu hóa sớm :)

4

Nếu không, bạn không thể vượt qua Object[] trong.

+1

@ BalusC Có bao giờ một tình huống mà bạn sẽ vượt qua để sắp xếp một mảng các đối tượng mà bạn không biết là tất cả thực hiện 'so sánh'? Bất kỳ việc sử dụng phương thức sắp xếp nào cũng sẽ được các đối tượng có thể so sánh '. Có vẻ như lý do duy nhất để chấp nhận 'Object []' là 'Object' được sử dụng thường xuyên hơn và quen thuộc hơn, và giống như ZeissS nói, nếu không chúng ta sẽ phải cast. –

+5

Vẫn còn rất nhiều 'toArray()' giống như các phương thức trong Java API trả về 'Object []'. – BalusC

+1

Chúng có thể đang thực hiện 'Comparator ', tương tự, nhưng không giống với 'Comparable ' – chama

Các vấn đề liên quan