2012-05-18 61 views
4

我試圖創建一個具有複製構造函數的通用容器。我使用的是即使在我已經編寫它的clone方法有問題這是我到目前爲止有:。泛型,複製構造函數,克隆方法

public class MyBox<T> 
{ 
    private List<T> list; 

    public MyBox() 
    { 
     list = new ArrayList<T>(); 
    } 


    public void add(T item) 
    { 
     list.add(item); 
    } 

    public MyBox(MyBox<T> other) throws CloneNotSupportedException //this is giving me trouble 
    { 
     for(T item : other.list) 
     { 
      list.add((T) item.clone()); 
     } 
    } 
} 

我怎樣才能讓我的拷貝構造函數的工作?

+1

如果將MyBox類定義爲:public class MyBox ?這應該工作。 –

+1

您能否澄清一下您是否需要製作*深層複製*的清單?換句話說,是否有必要複製列表中的每個元素,或者新列表是否可以指向相同的元素? –

回答

3

通常情況下,您不需要複製該項目。

public MyBox(MyBox<T> other) 
{ 
    list = new ArrayList<T>(other.list); 
} 

當你從集合的項目添加到集合B,該項目現在由兩個兩個收集一個引用和B.

0

如何限制通用的可克隆,那麼它肯定的是,項目的克隆將被允許:

public class MyBox<T extends Clonable> { 
    ... 
+0

不是。 'Cloneable'接口沒有公共'clone'方法,無論如何,實現'Cloneable'的類可能沒有克隆的方法。 'Cloneable'只是修改Object.clone()方法的行爲。 – newacct

0
public MyBox(MyBox<T> other) 
{ 
     this.list = new ArrayList<T>(other.getList()); 
} 

,但你必須爲你的名單首次在這種情況下添加一個getter。

UPD。這使得淺拷貝。

+0

他似乎想要列表的深層副本。 –

0

不幸的是在Java中,有克隆對象沒有通用的方法。某些類有一個公共clone()方法,它允許您克隆,但沒有公共超類或與公共clone()方法的接口。 (事實上​​,因爲沒有通用的接口;類甚至不需要稱之爲clone();他們可以將其命名爲copy()或其他東西)。您可以使用反射來查看是否存在公共clone()方法,但這可能是矯枉過正。