Как преобразовать список объектов в список интерфейсов?
У меня есть класс, который работает с интерфейсами:
Вот интерфейс:
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
}
Ответы
Ответ 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, вы должны иметь возможность добавить кошку в список.
Примечание: это я быстро угадываю