2011-11-15 15 views
1

一項任務要求我們使用ArrayList或LinkedList作爲後端來實現Bag數據類型。我選擇了ArrayList並創建了自己的實現,包括Collection接口的本地實現。現在我正在努力處理如何使用我的List類來調整Bag屬性的基本概念,特別是在List中插入List。實現基於Arraylist的Bag/Multiset-卡在泛型上

我的列表中設置方式遵循通常​​的Java類型,除了所有的方法都沒有實現,這就是爲什麼我寫我自己Collection接口類型爲

public interface Collection<E> 

實現添加,刪除,大小,清除,包含,isEmpty和toArray方法。

列表類型被聲明爲

public class List<E> implements Collection<E> 

有三個私有字段:

private int size; 
private E[] data; 
private int growSize=10; 

E[] data持有任何元素類型是必要的,並且growSize是新的插槽來增加列表中的號碼大小根據需要。當List被傳統用於單個對象時,這很好用,但當我嘗試插入List類型時,出現錯誤。

我想實現這個方法:

public boolean add(Collection<E> c){ 
    if (size < data.length){ 
    data= (E[]) new Object[10]; 
    data[0]= c; 
    } 
} 

當我嘗試這一點,它說有收集和E之間的類型不匹配

兩個問題:

  • 第一,我在這裏打破Java泛型的規則,爲什麼?
  • 其次,需要解決什麼問題?
+0

給你的錯誤,並導致它的代碼的更多信息,請 –

+0

E能類型列表的。你遇到了什麼錯誤? – JustinKSU

+0

'add'做什麼?添加單個元素?或添加一些集合中的所有元素? – newacct

回答

3

您不能對兩種不同類型使用參數化類型。在你的情況下(如果我找到你),你試圖使用E類型的參數化類型E和類型Collection<E>

如果您嘗試在List<E>中使用這兩種不同類型,實際上您在泛型中沒有用處。你可以在沒有它的情況下聲明你的List(和超類型集合)。

如果你想接受E類型對象的列表,並且他們每個人一個接一個的添加到您的List<E>,使E類型的每個這樣的對象將成爲你的列表中選擇元素,然後您應該實施更改爲類似:

public boolean addAll(Collection<E> c) { 
    for(E e : c) { 
    this.add(e); 
    } 
}