0

我想克隆列表:

public List<List<Test>> a = new ArrayList<List<Test>>();
public List<List<Test>> b = new ArrayList<List<Test>>();

但如果我这样做:

b = (ArrayList<List<Test>>)a.clone();

发生错误:

The method clone() is undefined for the type List<List<Test>>

你能帮助我吗?

4

4 回答 4

1

java.util.List不实现Cloneable,因此编译器无法确保您使用的具体实现确实如此。因此,它不允许您编写调用可能不存在的方法的代码。

如果你知道具体的实现,你可以转换它。Vg,如果它是一个ArrayList<List<Test>>(因为ArrayList确实实现了Cloneable),那么你做

  b = (List<List<Test>>) ((ArrayList<List<Test>>) a).clone();

如果不这样做,请实现自己的方法。

请记住,默认设置clone是浅拷贝。也就是说,返回的对象将是一个新的List<List<Test>>,但内部的List<Test>Test不会被复制,您将获得对原始对象的引用。

于 2013-02-03T12:41:38.780 回答
1

clone()不适用于抽象列表,仅适用于ArrayList. 但是它不会像你期望的那样工作,因为它只返回一个浅拷贝。要进行深层复制,您需要循环克隆:

   for (List<Test> item: a)
      b.add(new ArrayList(item);
于 2013-02-03T12:42:32.120 回答
0

使用构造函数或addAll方法:

new ArrayList<>(a);
//or
b.addAll(a);
于 2013-02-03T12:41:58.150 回答
0

如果您使用的是 Java 8,则可以使用与前一个对象相同的对象创建一个新列表,只需使用流:

List<Double> secondList = firstList.stream().collect(Collectors.toList());

如果你想要一个不与第一个共享相同对象的新列表,你可以这样做(假设你的对象实现Cloneable):

如果您使用的是 Java 8,则可以使用与前一个对象相同的对象创建一个新列表,只需使用流:

List<Double> secondList = firstList.stream().collect(Collectors.toList());

如果你想要一个不与第一个共享相同对象的新列表,你可以这样做(假设你的对象实现Cloneable):

List<Double> secondList = firstList.stream().map(v -> v.clone()).collect(Collectors.toList());
于 2015-05-19T09:48:50.117 回答