我想要克隆列表:
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>>
你能帮助我吗?
答案 0 :(得分:1)
java.util.List
未实现Cloneable
,因此编译器无法确保您正在使用的具体实现。因此,它不允许您编写调用可能不存在的方法的代码。
如果你知道具体的实现,你可以投了它。例如,如果它是ArrayList<List<Test>>
(因为ArrayList
确实实现了Cloneable
),那么你做
b = (List<List<Test>>) ((ArrayList<List<Test>>) a).clone();
如果不这样做,请实施自己的方法。
请记住,默认clone
会生成浅层副本。也就是说,返回的对象将是新的List<List<Test>>
,但内部List<Test>
和Test
将不会被复制,您将获得对原始对象的引用。
答案 1 :(得分:1)
clone()
不适用于摘要列表,仅适用于ArrayList
。但是它不会像你期望的那样工作,因为它只返回一个浅拷贝。要进行深层复制,您需要循环克隆:
for (List<Test> item: a)
b.add(new ArrayList(item);
答案 2 :(得分:0)
使用构造函数或addAll
方法:
new ArrayList<>(a);
//or
b.addAll(a);
答案 3 :(得分: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());