0

我得到了一个类,该类Shop维护类型项的集合T。它为单个或多个项目提供买卖功能,并使用 aList<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

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

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

第一个声明有效,但尝试在构造函数中实例化接口,正如预期的那样,不起作用。但据我所知,stock需要是 aCollection以便我可以Collection在处理它的其他函数中使用任何子类型。而且我很确定在这种情况下我不能使用通配符作为类型参数。那么我到底能做些什么来构建stock这里......或者我应该如何stock首先声明不同的地方?

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 回答