0

Shopタイプのアイテムのコレクションを維持するクラスが与えられTます。単一または複数のアイテムの売買機能を提供し、List<T>売買のコンテナとしてを使用します。

import java.util.*;

public class Shop<T> {
    List<T> stock;

    public Shop() { stock = new LinkedList<T>(); }
    public T buy() { 
        return stock.remove(0);
    }
    void sell(T item) {
        stock.add(item);
    }

    void buy(int n, List<T> items) {
        for (T e : stock.subList(0, n)) {
            items.add(e);
        }
        for (int i=0; i<n; ++i) stock.remove(0);
    }

    void sell(List<T> items) {
        for (T e : items) {
            stock.add(e);
        }
    }
}

今、私はこのクラスを変更して、あらゆるCollectionタイプのアイテムを売買できるようにする必要があります...だけではありませんList。私は、ほとんどすべてをコメントアウトし、stock:から始めて、物事を1つずつ変換しようとすることから始めると考えました。

 public class Shop<T> {
   // List<T> stock;
      Collection<T> stock;

   // public Shop() { stock = new LinkedList<T>(); }
      public Shop() { stock = new Collection<T>(); }            
      ...
      ... 
  }  

最初の宣言は機能しますが、コンストラクターでインターフェイスをインスタンス化しようとしても、期待どおりに機能しません。しかし、私が知る限り、それを処理する他の関数で任意のサブタイプを使用できるようにstockする必要があります。そして、この場合、タイプパラメータとしてワイルドカードを使用することはできないと確信しています。では、ここを構築するために正確に何ができるでしょうか...または、そもそも別の方法で宣言する必要がありますか?CollectionCollectionstockstock

4

1 に答える 1

3

Collectionクラス内で使用する実際のコレクションの実装は、インターフェイス定義が受け入れる限り、クラスのクライアント/ユーザーにとってまったく重要ではありません。

void buy(int n, List<T> items)
void sell(List<T> items)

する必要があります

void buy(int n, Collection<T> items)
void sell(Collection<T> items)

Listこれにより、タイプのみを使用するように制限されることはありません。次に、内部メンバーstockは、の具体的なサブタイプでインスタンス化でき、インスタンス化する必要がありますCollection

于 2012-11-18T03:42:31.497 に答える