我正在尝试创建一个具有复制构造函数的通用容器。即使我编写了克隆方法,我也无法使用克隆方法。这是我到目前为止所拥有的:
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());
}
}
}
如何让我的拷贝构造函数起作用?
答案 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()
方法,但这可能有点矫枉过正。