【问题标题】:How to convert list of objects to list of interfaces?如何将对象列表转换为接口列表?
【发布时间】:2011-11-26 05:16:11
【问题描述】:

我有一些使用接口的类:

界面如下:

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

在主程序中,我创建了一个猫列表。我使用glazed lists 在列表更改以及使用此列表创建控件模型时动态更新控件。

目标是将这个列表转移到一个worker对象,这样我就可以在主过程中添加一些新的猫到列表中,并且worker无需再次设置它的list属性就可以知道它(list是main中的同一个对象proc和工人)。但是当我打电话给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
}

【问题讨论】:

    标签: java interface casting glazedlists


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      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
      }
      

      大多数情况下,只需立即构造一个 Orderable 列表,因为 cat 实现了 Orderable,您应该能够将一只猫添加到列表中。

      注意:这是我的猜测

      【讨论】:

        【解决方案3】:

        如果您只是更改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);
        

        见:

        【讨论】:

          【解决方案4】:

          您需要更改Worker 类,使其接受List&lt;? extends Orderable&gt;

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

          【讨论】:

          • 这种方法对我来说效果最好,因为我只需要更改“Worker”方法签名,而不是数组的声明,我不想在 all中涉及> 我的文件。 IMO 比 Matt Ball 建议的答案更可行
          猜你喜欢
          • 2011-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多