如何在Java中克隆对象

3
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()不可见。


3
Attachment是否实现了Cloneable接口,还是仅仅是一个接口,也就是说,Attachment的实现是否实现了Cloneable接口? - Thomas
我觉得不行,我看不到它是第三方的jar包。 - Prasad V S
是的,从在线JavaDocs来看,似乎不行。在这种情况下,您无法调用Attachment上的clone。也许有另一种克隆它们的方法,或者可能有完全不同的方法可以实现您想要的效果。顺便问一下,您的最终目标是什么? - Thomas
我正在两次读取 List<Attachment> 对象,但第二次我没有得到附件内容。 - Prasad V S
也许你想问一个关于这个的问题。我不明白的是:第二次阅读时,您是否无法获取附件或者附件对象为空? - Thomas
第二次附件对象为空,请注意。 - Prasad V S
4个回答

5
请勿使用Java标准的clone方法来自Object。在阅读Josh Bloch在他的书Effective Java中关于克隆的内容之前,至少不要使用该方法。
在这种情况下,您需要进行深度复制,即创建一个空的Attachment对象的ArrayList(这一点您已经做到了),并复制每个Attachment对象的所有字段的

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*/ }
}

这段代码期望model实现了java.io.Serializable,但是对于org.apache.cxf.jaxrs.ext.multipart.Attachment似乎并非如此。 - Steve C

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

这段代码的实际问题是运算符优先级问题。假设实际对象是可克隆的,并暂时忽略是否应该克隆它这个问题,应该编写如下:
clone.add((Attachment)((Attachment)item).clone());

0
将最后一行替换为:
clone.add(((Attachment)item).clone());

请确保Attachment实现了Cloneable接口


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接