2012-07-04 92 views
0

我有一個基類稱爲AddressType克隆一個基類的列表

我也有兩個子類叫HouseholdAddressType,PersonalAddressType。 (所以這兩個擴展的AddressType)

我繞過地址類型的列表:

List<AddressType> addresses 

許多方法,以及預製棒不同的任務,因此,我想在我瓶坯這些任務可以克隆該列表。 。

我嘗試這樣的:

List<AddressType> copyOfAddress = new ArrayList<AddressType>(addresses.size()); 
    for (AddressType addressType: addresses) { 
     copyOfAddress.add((AddressType)addressType.clone());   
    } 

但它不工作,指出: 「克隆已訪問保護」

我該如何克隆這個列表? 例子我的同班同學的名字將是一件好事..謝謝這麼多

+0

究竟在說「克隆已保護訪問'? –

+0

另外,你有克隆本身嗎?否則,你正在執行淺拷貝而不是深拷貝,你應該實現可複製和重寫克隆 –

回答

3

AddressType必須實現Cloneable接口,

import java.util.ArrayList; 
import java.util.List; 


public class Foo { 
    public static void main(String[] args) { 

     List<Person> oldList = new ArrayList<Person>(1); 
     oldList.add(new Person("Harry", "Potter")); 

     List<Person> newList = new ArrayList<Person>(); 
     for(Person person : oldList) 
     { 
      newList.add(person.clone()); // Deep copy of each person too. 
     } 

     Person person = newList.get(0); 
     person.setFirstName("James"); 

     System.out.println("Old list = " + oldList); 
     System.out.println("New list = " + newList); 
    } 

    static class Person implements Cloneable 
    { 
     private String firstName; 
     private String lastName; 

     Person(String firstName, String lastName) 
     { 
      this.firstName = firstName; 
      this.lastName = lastName; 
     } 

     private Person(Person person) 
     { 
      this.firstName = person.firstName; 
      this.lastName = person.lastName; 
     } 

     public void setFirstName(String firstName) 
     { 
      this.firstName = firstName; 
     } 

     public String getFirstName() 
     { 
      return firstName; 
     } 

     public void setLastName(String lastName) 
     { 
      this.lastName = lastName; 
     } 

     public String getLastName() 
     { 
      return lastName; 
     } 

     @Override 
     public String toString() 
     { 
      StringBuilder sb = new StringBuilder(); 

      sb.append(firstName); 
      sb.append(" "); 
      sb.append(lastName); 

      return sb.toString(); 
     } 

     @Override 
     public Person clone() 
     { 
      return new Person(this); 
     } 
    } 
} 

輸出

Old list = [Harry Potter] 
New list = [James Potter] 
+0

這可能是最好的解決方案,因爲它正在使用拷貝構造函數集合。如果我沒有弄錯,除非他的類實現了Cloneable,否則它不會執行深層複製。 –

+1

沒錯,但是如果他沒有實現可複製的列表將不會被深拷貝,而是被複製得更淺,所以對象的克隆方法會被調用,因爲它沒有被覆蓋... java中的克隆沒有被破壞,它只是isn '完美 –

+0

@BenjaminGruenbaum,你是絕對正確的。如果OP沒有實現'Cloneable'接口並覆蓋'clone'方法,則不會創建列表內容的深層副本,儘管列表本身的深層副本將被創建。 – user1329572