【问题标题】:Generics, Copy Constructor, Clone method泛型、复制构造函数、克隆方法
【发布时间】:2012-05-18 14:44:39
【问题描述】:

我正在尝试创建一个具有复制构造函数的通用容器。即使我已经编写了 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());
        }
    }
}

如何让我的复制构造函数工作?

【问题讨论】:

  • 如果将 MyBox 类定义为:public class MyBox?那应该可以。
  • 能否请您澄清您是否需要制作列表的深拷贝?换句话说,是否也需要复制列表中的每个元素,还是新列表只能指向相同的元素?

标签: java generics clone copy-constructor


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不是真的。 Cloneable 接口没有公共的clone 方法,无论如何实现Cloneable 的类可能没有克隆方法。 Cloneable 只是修改了Object.clone() 方法的行为。
    【解决方案3】:
    public MyBox(MyBox<T> other) 
    {
          this.list = new ArrayList<T>(other.getList()); 
    }
    

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

    UPD。这使得浅拷贝。

    【讨论】:

    • 他似乎想要一份列表的深层副本。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-09
      • 1970-01-01
      • 2018-09-20
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多