我有一个类似这样的课程:
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,在一个最小的工作示例上它起作用。当然,错误应该在其他地方,这只是一个副作用。
答案 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;是必要的,否则你会收到编译错误。
希望这有帮助。