2014-03-12 59 views
0

我從下面的一個項目中獲取了一些示例代碼。其中,我需要將Vector v的元素深入克隆到Vector w中。換句話說,每個單獨的元素都需要在內存中引用自己的位置。Java - 深度克隆具有多種類型元素的矢量

在我的程序中,我需要製作不同類型的對象並將它們添加到Vector中。然後我需要克隆該向量中的每個元素(意思是將它們放在內存中),並將這些克隆的元素添加到新的Vector中。問題是我不知道如何克隆當程序員不知道對象類型時。如果每個元素都是相同的類型,我可以轉換爲該類型。但這不是這種情況。

在我的代碼中,我確定給定的元素實現了Cloneable,但我不知道如何執行實際的克隆。 (以某種方式鑄造適當的類型,然後調用克隆()或其他方式)。

謝謝。我的代碼如下,非常感謝任何幫助。

import java.util.*; 

public class Test { 
    public static void main(String[] arguments) { 
     // Establish variables 
     Point p1 = new Point(); 
     Point p2 = new Point(1, 2); 
     A a1 = new A(); 
     A a2 = new A(1); 

     // Create vector v and add variables to vector 
     Vector v = new Vector(); 
     v.add(p1); 
     v.add(p2); 
     v.add(a1); 
     v.add(a2); 

     // Change p1.x 
     p1.x = 1; 

     // Create vector w and assign elements from v into vector 
     Vector w = new Vector(); 
     int n = v.size(); 
     for (int i = 0; i < n; i++) 
      if (v.get(i) instanceof Cloneable) 
       w.add(v.get(i)); 

     // print elements in vectors 
     System.out.println(v); 
     System.out.println(w); //elements seem to reference the same area in memory 
    } 
} 

class Point implements Cloneable { 
    int x; 
    int y; 

    Point() { 
     x = 0; 
     y = 0; 
    } 

    Point(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public Object Clone() { 
     try {return super.clone();} 
     catch (CloneNotSupportedException exception) {return null;} 
    } 

    public String toString() {return "Point[x=" + x + ",y=" + y + "]";} 
} 

class A implements Cloneable { 
    int i; 

    A() {i = 0;} 

    A(int i) {this.i = i;} 

    public Object Clone() { 
     try {return super.clone();} 
     catch (CloneNotSupportedException exception) {return null;} 
    } 

    public String toString() {return "A[i=" + i + "]";} 
} 
+1

但爲什麼哦爲什麼你使用'Vector'? – dimo414

+0

我會在這裏非常非常小心。在Java中,可執行文件通常是程序員錯誤*最容易的事情之一。你正在做出一個巨大的假設,即每個實現可複製類的類將會做你正在尋找的確切類型的深層副本。 – avgvstvs

回答

1

您可以對整個向量進行深度序列化,而不是序列化單個元素。

public static <T extends Serializable> T deepCopyOfSerializable(T o) throws Exception 
{ 
    if (o == null) 
     return null; 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos = new ObjectOutputStream(bos); 

    oos.writeObject(o); 
    bos.close(); 
    oos.close(); 

    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); 
    ObjectInputStream ois = new ObjectInputStream(bis); 

    T t = (T) ois.readObject(); 
    bis.close(); 
    ois.close(); 
    return t; 
} 
+0

可悲的說,沒有工作。它拋出了一個NotSerializableException,可能是因爲裏面的對象是不可序列化的? – user1567060

+0

是的。每個實體都必須是可序列化的 – prasanth