2012-07-04 63 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