如何在java中克隆对象

时间:2016-02-16 09:10:06

标签: java java-ee

org.apache.cxf.jaxrs.ext.multipart.Attachment attachments=null;

List<Attachment> clone = new ArrayList<Attachment>(attachments.size());
for(Object item: attachments) 
clone.add((Attachment)item.clone());//The method clone() from the type Object is not visible

我想克隆List<Attachment> clone对象,但它说的是Object类型的方法clone()不可见

4 个答案:

答案 0 :(得分:5)

请勿使用clone中的Java标准Object方法。至少在你阅读Josh Bloch在他的书Effective Java中所说的关于克隆的内容之前。

在这种情况下,您需要执行深层复制,即创建一个空ArrayListAttachment个对象(您做过)并复制Attachment对象的所有字段中的strong>。

答案 1 :(得分:0)

深度克隆样本

 public static Object deepClone(Object model) {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(model);

        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        return ois.readObject();
    } 
    catch (IOException e)               { .. } 
    catch (ClassNotFoundException e)    { .. }
    finally { /*close stream*/ }
}

答案 2 :(得分:0)

clone.add((Attachment)item.clone());//The method clone() from the type Object is not visible

此代码的实际问题是运算符优先级问题。假设实际对象是可复制的,并且暂时忽略了你是否应该克隆它的问题,那么应该写出来:

clone.add((Attachment)((Attachment)item).clone());

答案 3 :(得分:0)

将最后一行替换为:

clone.add(((Attachment)item).clone());

确保Attachment实现了界面Cloneable