3

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

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

4 回答 4

3

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

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

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

于 2012-05-18T14:52:52.520 回答
0

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

于 2012-05-18T21:29:01.493 回答
0

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

public class MyBox<T extends Clonable> {
   ...
于 2012-05-18T14:50:35.910 回答
0
public MyBox(MyBox<T> other) 
{
      this.list = new ArrayList<T>(other.getList()); 
}

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

UPD。这使得浅拷贝。

于 2012-05-18T14:52:37.930 回答