如何将对象列表转换为接口列表?

2022-09-01 02:27:14

我有一些与接口一起使用的类:

这是界面:

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

在主要过程中,我创建了一个猫的列表。我使用琉璃列表在列表更改时以及使用此列表创建控件模型时动态更新控件。

目标是将此列表转移到工作线程对象,因此我可以在主过程中向列表中添加一些新的 cat,并且工作线程将知道它而无需再次设置其列表属性(列表在主过程和工作程序中是相同的对象)。但是,当我称之为关于期望可订购但得到一只猫的警报时......但是Cat实现了Orderable。我该如何解决这个问题?worker.setList(cats)

下面是主代码:

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

您需要更改该类,使其接受WorkerList<? 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

如果您真的想要接口类型的新集合。例如,当您不拥有正在调用的方法时。

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