无法在java中返回List的副本

时间:2016-05-20 22:42:36

标签: java arraylist

我有一个类似这样的课程:

  public class People {
        private ArrayList<Person> people;
        ...
    }

在这个类中,我想创建一个返回数组people的副本的方法,因为它是私有的,我想避免隐私泄露。

我一直在尝试按照其他线程和变体的建议使用此方法,但没有成功:

public ArrayList<Person> getPeople() {
        return new ArrayList<Person>(people);
}

但是,我收到编译错误消息:

 error: no suitable constructor found for ArrayList(ArrayList<Person>)

更新:

我正在使用import java.util.ArrayList;

更详细的编译错误消息:

  constructor ArrayList.ArrayList(int) is not applicable
  (argument mismatch; ArrayList<Person> cannot be converted to int) 
 constructor ArrayList.ArrayList(Collection<? extends Person>) is not applicable
 (argument mismatch; ArrayList<Person> cannot be converted to Collection<? extends Person>)

更新2:

Apparetly,在一个最小的工作示例上它起作用。当然,错误应该在其他地方,这只是一个副作用。

2 个答案:

答案 0 :(得分:0)

java.util.ArrayList是一个实现java.util.List的类。最好将变量声明为接口,并使方法返回接口,以便从使用类的代码中隐藏实现。

public class People {
    private List<Person> people;
    ...
}


public List<Person> getPeople() {
    return new ArrayList<Person>(people);
}

那会更好。另外,Person是一个可变对象吗?如果是这样,你的getPeople方法需要制作人员列表的深层副本以保留封装。

答案 1 :(得分:-1)

复制ArrayList的一种方法是:

public ArrayList<Person> getPeople() {
    ArrayList<Person> temp = new ArrayList<Person>();

    for(Person p : people)
        temp.add(p);

    return temp;
}

这基本上会创建一个相同类型的空ArrayList,并复制来自&#39; people&#39;的所有元素。进入它,然后返回副本。

另一种方式是:

@SuppressWarnings("unchecked")
public ArrayList<Person> getPeople() {
    return people.clone();
}

&#39; @SuppressWarnings(&#34;未经检查&#34;)&#39;是必要的,否则你会收到编译错误。

希望这有帮助。