1

我不明白为什么以下代码不起作用。我正在尝试使用现有对象元素创建一个新对象,然后处理新对象以更改其元素。最后两个对象都改变了。我究竟做错了什么?

    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()
4

1 回答 1

1

因为aproximatedContourscontours具有相同的元素引用。

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

        }

    }
于 2013-08-08T06:17:14.133 回答