2010-02-09 48 views
15

Tôi muốn có một giao diện A được tham số TA<T> và cũng muốn mọi lớp triển khai thực hiện Comparable (với T và các loại phụ của nó). Nó có vẻ tự nhiên để viết interface A<T> extends Comparable<? extends T>, nhưng điều đó không hoạt động. Làm thế nào tôi nên làm điều đó sau đó?Giao diện Java mở rộng So sánh

+1

Tôi cũng sẽ giới thiệu cho bạn các câu hỏi thường gặp về Java Generics (http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ204), sẽ cung cấp cho bạn thêm ý tưởng về 'So sánh '. –

Trả lời

16

Khi Comparable<? extends T> xuất hiện nó có nghĩa là bạn có một thể hiện của Comparable có thể được so sánh với một (không rõ) subtype của T, không phải là nó có thể được so sánh với bất kỳ subtype của T.

Nhưng bạn don' t cần điều đó, bởi vì Comparable<T> có thể tự so sánh với bất kỳ loại phụ nào là T, ví dụ: a Comparable<Number> có thể so sánh chính nó với một số Comparable<Double>.

Vì vậy, hãy thử:

interface A<T> extends Comparable<T> { 
    // ... 
} 

hoặc

interface A<T extends Comparable<T>> extends Comparable<A<T>> { 
    // ... 
} 

tùy thuộc vào việc bạn cần để có thể so sánh trường hợp của T để thực hiện phương pháp compareTo của bạn.

+0

Đây là một câu trả lời tuyệt vời! Tôi đến đây từ http://stackoverflow.com/questions/6290406/generic-method-to-sort-a-map-on-values. Giải quyết vấn đề của tôi. –

2

Nếu bạn sử dụng so sánh bạn không cần phải xác định khả năng cho các kiểu con trong hàm so sánh, nó có thể truyền vào bất kỳ kiểu con nào của đối tượng X thành phương thức khai báo tham số lớp X. Xem mã dưới đây để biết thêm thông tin.

public interface Test<T> extends Comparable<T> { 

} 

class TestImpl implements Test<Number> { 
    @Override 
    public int compareTo(final Number other) { 
     return other.intValue() - 128; 
    } 
} 

class TestMain { 
    public static void main(final String[] args) { 
     TestImpl testImpl = new TestImpl(); 
     testImpl.compareTo(Integer.MIN_VALUE); 
    } 
} 
Các vấn đề liên quan