2011-08-28 33 views
9

Tôi đang tạo TreeMap<String, String> và muốn đặt hàng theo kiểu giảm dần. Tôi tạo ra sự so sánh sau:Máy so sánh <String> phải ghi đè lên phương thức siêu hạng

Comparator<String> descender = new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     return o2.compareTo(o1); 
    } 
}; 

tôi xây dựng TreeMap như vậy:

myMap = new TreeMap<String, String>(descender);

Tuy nhiên, tôi nhận được lỗi sau:

The method compare(String, String) of type new Comparator<String>(){} must override a superclass method 

Tôi đã không bao giờ đầy đủ groked generics, tôi đang làm gì sai?

+1

Theo như tôi thấy, không có gì. Lỗi sẽ được gây ra nếu phương thức so sánh của bạn không khớp với chữ ký của phương thức compare() của Comparator, nhưng điều đó dường như không phải là trường hợp như tôi thấy. – fwielstra

Trả lời

17

dự án Eclipse của bạn dường như được thiết lập để Java 1.5. Chú thích @Override sau đó thực sự không được hỗ trợ trên các phương thức giao diện. Xóa chú thích đó hoặc sửa mức tuân thủ của dự án của bạn thành Java 1.6.

+0

Tốt đoán ở đó. –

1

Ah, tôi đã phát hiện sự cố. Khi khởi tạo một cá thể ẩn danh mới của một Comparable, tôi không ghi đè các phương thức giao diện ... Tôi đang triển khai chúng. Chỉ thị @Override là vấn đề. Phương thức compare() không ghi đè phương thức hiện có, nó đã thực hiện một phần của giao diện. Tôi đã sao chép mã đó từ một địa điểm khác và không cần có @Override.

+3

Dự án của bạn có thể được đặt thành 1,5 cấp nguồn. Vì 1.6 bạn cũng được phép chú thích các phương thức được chỉ định bởi giao diện có '@ Override'. –

7

Bạn không cần viết Comparator tùy chỉnh nếu bạn chỉ muốn đảo ngược thứ tự tự nhiên (tăng dần).

Để có được một trật tự giảm dần chỉ cần sử dụng:

myMap = new TreeMap<String, String>(java.util.Collections.reverseOrder()); 
+0

Oh, phương pháp tiện lợi rất đẹp! Cảm ơn! –

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