Подтвердить что ты не робот

Как преобразовать список объектов в список интерфейсов?

У меня есть класс, который работает с интерфейсами:

Вот интерфейс:

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

Вот рабочий класс:

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
   }
}

Вот объект, реализующий интерфейс:

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;
    }
}

В основной процедуре я создаю список кошек. Я использую застекленные списки для динамического обновления элементов управления при изменении списка и при создании модели управления с помощью этого списка.

Цель состоит в том, чтобы перенести этот список на рабочий объект, поэтому я могу добавить некоторую новую кошку в список в основной процедуре, и работник узнает об этом, не изменив ее свойство списка снова (список - это тот же самый объект в главном proc и у рабочего). Но когда я звоню worker.setList(cats), он предупреждает о ожидании заказа, но получает Cat... но Cat реализует Orderable. Как это решить?

Вот основной код:

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
}
4b9b3361

Ответ 1

Вам нужно изменить класс Worker, чтобы он принял 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  
   }
}

Ответ 2

Он должен работать, если вы просто измените объявление 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);

См:

Ответ 3

Если вам действительно нужна новая коллекция типа интерфейса. Когда, например, вы не владеете методами, которые вы вызываете.

//worker.setList(cats); 
worker.setList( new ArrayList<Orderable>(cats)); //create new collection of interface type based on the elements of the old one

Ответ 4

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
}

В основном, просто создайте список заказчиков сразу, так как cat реализует Orderable, вы должны иметь возможность добавить кошку в список.

Примечание: это я быстро угадываю