2011-09-27 82 views
28

Tôi có một số lớp học làm việc với giao diện:Làm thế nào để chuyển đổi danh sách các đối tượng thành danh sách giao diện?

Dưới đây là giao diện:

public interface Orderable 
{ 
    int getOrder() 
    void setOrder() 
} 

Đây là giai cấp công nhân:

public class Worker 
{ 
    private List<Orderable> workingList; 

    public void setList(List<Orderable> value) {this.workingList=value;} 

    public void changePlaces(Orderable o1,Orderable o2) 
    { 
    // implementation that make o1.order=o2.order and vice versa 
    } 
} 

Dưới đây là một đối tượng mà thực hiện giao diện:

public class Cat implements Orderable 
{ 
    private int order; 

    public int getOrder() 
    { 
     return this.order; 
    } 

    public void setOrder(int value) 
    { 
     this.order=value; 
    } 

    public Cat(String name,int order) 
    { 
     this.name=name; 
     this.order=order; 
    } 
} 

Trong quy trình chính, tôi tạo danh sách mèo. Tôi sử dụng glazed lists để tự động cập nhật các điều khiển khi danh sách được thay đổi và khi mô hình điều khiển được tạo với danh sách này.

Mục đích là chuyển danh sách này sang đối tượng công nhân, vì vậy tôi có thể thêm một số mèo mới vào danh sách trong quy trình chính và nhân viên sẽ biết về nó mà không cần thiết lập lại danh sách của nó (danh sách là cùng một đối tượng proc chính và công nhân). Nhưng khi tôi gọi worker.setList(cats), cảnh báo về việc mong đợi một Orderable, nhưng nhận được một con mèo ... nhưng Cat thực hiện Orderable. Tôi giải quyết điều này như thế nào?

Đây là mã chính:

void main() 
{ 
    EventList<Cat> cats=new BasicEventList<Cat>(); 

    for (int i=0;i<10;i++) 
    { 
     Cat cat=new Cat("Maroo"+i,i); 
     cats.add(cat); 
    } 

    Worker worker=new Worker(); 
    worker.setList(cats); // wrong! 
    // and other very useful code 
} 

Trả lời

32

Bạn cần phải thay đổi lớp Worker để nó chấp nhận List<? extends Orderable>

public class Worker 
{ 
    private List<? extends Orderable> workingList; 

    public void setList(List<? extends Orderable> value) {this.workingList=value;} 

    public void changePlaces(Orderable o1,Orderable o2) 
    { 
    // implementation that make o1.order=o2.order and vice verca 
    } 
} 
+0

Cách tiếp cận này phù hợp nhất với tôi vì tôi chỉ phải thay đổi chữ ký "Công nhân" chứ không phải khai báo mảng mà tôi không muốn chạm vào _all_ tệp của mình. IMO một cách tiếp cận khả thi hơn so với câu trả lời được đề xuất của Matt Ball – Makibo

7

Nó sẽ làm việc nếu bạn chỉ cần thay đổi tuyên bố cats:

List<? extends Orderable> cats = new BasicEventList<? extends Orderable>(); 

for (int i=0; i<10; i++) 
{ 
    cats.add(new Cat("Maroo"+i, i)); 
} 

Worker worker = new Worker(); 
worker.setList(cats); 

Xem:

1
void main() 
{ 
    EventList<Orderable> cats = new BasicEventList<Orderable>(); 

    for (int i=0;i<10;i++) 
    { 
     Cat cat=new Cat("Maroo"+i,i); 
     cats.add(cat); 
    } 

    Worker worker=new Worker(); 
    worker.setList(cats); // should be fine now! 
    // and other very usefull code 
} 

Chủ yếu, chỉ cần xây dựng một danh sách các Orderables ngay lập tức , kể từ khi mèo implem ents Có thể đặt hàng, bạn sẽ có thể thêm một con mèo vào danh sách.

lưu ý: đây là tôi nhanh chóng đoán

4

Nếu bạn thực sự muốn có một bộ sưu tập mới của các loại giao diện. Ví dụ, bạn không sở hữu các phương thức mà bạn đang gọi.

//worker.setList(cats); 
worker.setList(new ArrayList<Orderable>(cats)); //create new collection of interface type based on the elements of the old one 
Các vấn đề liên quan