2012-11-18 62 views
0

我得到了一個類Shop,它維護類型爲T的項目集合。它提供了買入和賣出的單個或多個項目的功能和使用List<T>作爲容器的買賣:使給定的Java類更具通用性和靈活性

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需要是Collection,以便我可以在處理它的其他函數中使用任何Collection子類型。我敢肯定,在這種情況下,我不能使用通配符作爲類型參數。那麼我到底能夠做些什麼來構建stock ......或者我應該如何首先聲明stock

+0

您可以開始使'Collection '成爲'Collection '和其他所有使用參數化類型的地方 – kolossus

+0

但是我怎樣才能構建'stock'?我不能實例化一個'Collection'接口。 – nicole

+1

在運行時,你不會實例化一個'Collection',你的實際容器類可以是任何擴展'Collection'的接口。我在這裏規定的靈活性僅限於容器將包含的內容,這是'T' – kolossus

回答

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實例化。

+0

因此,股票可以被實例化爲(例如)一個'List',但真的被認爲是一個'Collection'? – nicole

+0

是的,因爲List是一個集合。 – Vikdor