泛型,复制构造函数,克隆方法

时间:2012-05-18 14:44:39

标签: java generics clone copy-constructor

我正在尝试创建一个具有复制构造函数的通用容器。即使我编写了克隆方法,我也无法使用克隆方法。这是我到目前为止所拥有的:

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());
        }
    }
}

如何让我的拷贝构造函数起作用?

4 个答案:

答案 0 :(得分:3)

通常您不需要克隆该项目。

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

当您将集合A中的项目添加到集合B时,该项目现在由两个集合A和B引用。

答案 1 :(得分:0)

如何将泛型限制为Clonable,那么肯定会允许克隆项目:

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

答案 2 :(得分:0)

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

但在这种情况下,您必须首先为列表添加一个getter。

UPD。这使得浅拷贝。

答案 3 :(得分:0)

不幸的是,在Java中,没有通用的方法来克隆对象。有些类具有公共clone()方法,允许您克隆,但没有公共超类或具有公共clone()方法的接口。 (事实上​​,因为没有通用接口;类甚至不必调用它clone();它们可以将其命名为copy()或其他。)您可以使用反射来查看是否存在公共clone()方法,但这可能有点矫枉过正。