Как преобразовать список объектов в список интерфейсов? - PullRequest
36 голосов
/ 27 сентября 2011

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

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

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

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

Цель состоит в том, чтобы перенести этот список в рабочий объект, поэтому яМожно добавить нового кота в список в основной процедуре, и работник узнает об этом, не устанавливая его свойство списка снова (список - это один и тот же объект в основном процессе и в работнике).Но когда я звоню worker.setList(cats), он предупреждает о том, что ожидает Orderable, но получает 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
}

Ответы [ 4 ]

52 голосов
/ 27 сентября 2011

Вам нужно изменить класс 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  
   }
}
6 голосов
/ 18 ноября 2014

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

//worker.setList(cats); 
worker.setList( new ArrayList<Orderable>(cats)); //create new collection of interface type based on the elements of the old one
1 голос
/ 27 сентября 2011
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
}

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

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

...