2011-02-01 26 views
9

Tôi có một loạt các lớp trong java mà tất cả triển khai một giao diện được gọi là IdObject (chỉ định phương thức getId()). Hơn nữa, tất cả chúng cũng thực hiện Comparable <> với chính chúng như là tham số kiểu, vì vậy chúng có thể so sánh với chính chúng.Java: Khai báo các biến có nhiều "ràng buộc" chung trên chúng

Điều tôi muốn làm là khai báo danh sách các đối tượng như vậy, điền vào, sau đó sắp xếp nó và gọi hàm getId() trên chúng. Vì vậy, mã của tôi trông như thế này:

List<? extends IdObject & Comparable<?>> objectList = null; 

if (foo) { 
    objectList = new ArrayList<TypeA>(); 
    ... 
} else if (bar) { 
    objectList = new ArrayList<TypeB>(); 
    ... 
} 

if (objectList != null) { 
    Collections.sort(objectList); 
    for (IdObject o : objectList) { 
     System.out.println(o.getId()); 
    } 
} 

Về cơ bản vấn đề của tôi nằm trong dòng đầu tiên - Tôi muốn xác định hai "trở ngại" cho các loại bởi vì tôi cần người đầu tiên để đảm bảo tôi có thể in ID trong vòng lặp và thứ hai để đảm bảo rằng tôi có thể sử dụng Collections.sort() trong danh sách.

Dòng đầu tiên không biên dịch.

Có cách nào để thực hiện công việc này mà không chỉ định loại chung mà không có thông số loại và sử dụng các hoạt động không được kiểm tra? Tôi cũng không thể tìm thấy một ví dụ về điều này trên internet.

Chúc mừng

Trả lời

0

Cách tạo kiểu chống phân loại;

public CompIdObject extends IdObject implements Comparable { 
... 
} 

và sử dụng loại này cho thuốc generic của bạn?

List<? extends CompIdObject<?>> objectList = null; 
+2

Cảnh báo: CompIdObject của bạn không được khai báo là chung chung. – Nicolas

11
List<? extends IdObject & Comparable<?>> 

Đây là loại multiple bounded type parameters chỉ có thể ở chữ ký lớp, tôi sợ.

Vì vậy, tôi đoán gần nhất bạn có thể nhận được là để xác định một giao diện:

public interface MyInterface extends IdObject, Comparable<MyInterface> 

Và tuyên bố danh sách của bạn như thế này:

List<? extends MyInterface> objectList = null; 
+1

Tốt hơn để nói 'ComparableIdObject' hơn' MyInterface'. – Raedwald

+0

@Raedwald rõ ràng, vâng. –

+1

Bạn có thực sự mong đợi mọi lớp thực thi 'MyInterface' có thể so sánh được với nhau không? Nếu không, hãy thử 'giao diện công cộng MyInterface mở rộng IdObject, so sánh >' và 'Danh sách > objectList' – finnw

0

Tôi đã muốn làm những điều tương tự trước đó trên các lĩnh vực là tốt, nhưng nó không thể được thực hiện (có lẽ ai đó có thể giải thích về việc đây là một hạn chế kỹ thuật hay một sự lựa chọn thiết kế, tôi không chắc chắn.)

Con đường phía trước sẽ là thiết kế một khuôn mặt mở rộng IdObject và Comparable, sau đó sử dụng nó trong định nghĩa danh sách chung của bạn.

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