我不明白为什么以下代码无效。 我试图使用现有的对象元素创建一个新对象,然后处理新对象以更改其元素。最后两个对象都改变了。我做错了什么?
contours = new ArrayList<MatOfPoint>();
hierarchy = new Mat();
//find contours of filtered image using openCV findContours function
Imgproc.findContours(mFilteredFrameNoHoles, contours, hierarchy , Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
//Aproximate contours
aproximatedContours = new ArrayList<MatOfPoint>(contours);
//aproximatedContours = (ArrayList<MatOfPoint>) contours.clone();
//aproximatedContours.addAll(contours);
aproximatedContours.doSomeOperations()
答案 0 :(得分:1)
因为aproximatedContours
和contours
具有相同的元素引用。
aproximatedContours = new ArrayList<MatOfPoint>(contours);
只需在轮廓中创建一个包含相同元素的新列表,如果这些元素为mutated
,效果也会反映在另一个列表中。
除非你真的知道副作用,否则抛弃这样的共享可变对象通常是一个坏主意。以下示例演示了此行为:
class Foo{
int val;
Foo(int x){
val = x;
}
void changeVal(int x){
val = x;
}
public static void main(String[] args) {
Foo f = new Foo(5);
List<Foo> first = new ArrayList<Foo>();
first.add(f);
List<Foo> second = new ArrayList<Foo>(first);
System.out.println(first.get(0).val);//prints 5
second.get(0).changeVal(9);
System.out.println(first.get(0).val);//prints 9
}
}