41

インターフェイスで動作するクラスがいくつかあります。

インターフェースは次のとおりです。

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

4 に答える 4

63

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  
   }
}
于 2011-09-27T16:41:34.647 に答える
1
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 を実装しているため、リストに cat を追加できるはずです。

注:これは私の推測です

于 2011-09-27T16:44:53.523 に答える