如何在Java中克隆generics列表?

我有一个ArrayList<String> ,我想返回一个副本。 ArrayList具有以下签名的克隆方法:

 public Object clone() 

在我调用这个方法之后,如何将返回的Object转换回ArrayList<String>

 ArrayList newArrayList = (ArrayList) oldArrayList.clone(); 

你为什么要克隆? 创build一个新的列表通常更有意义。

 List<String> strs; ... List<String> newStrs = new ArrayList<>(strs); 

任务完成。

这是我使用的代码:

 ArrayList copy = new ArrayList (original.size()); Collections.copy(copy, original); 

希望对你有用

请注意,Object.clone()有一些主要的问题,在大多数情况下,它的使用是不鼓励的。 请参阅Joshua Bloch的“ Effective Java ”中的第11项,作为完整答案。 我相信你可以在原始types数组上安全地使用Object.clone(),但除此之外,你需要明智的使用和覆盖克隆。 你可能最好定义一个拷贝构造函数或静态工厂方法,根据你的语义显式地克隆对象。

我认为这应该使用Collections API来实现:

注意 :复制方法以线性时间运行。

 //assume oldList exists and has data in it. List<String> newList = new ArrayList<String>(); Collections.copy(newList, oldList); 

使用Java 8,可以使用stream进行克隆。

 import static java.util.stream.Collectors.toList; 

 List<AnObject> clone = myList.stream().collect(toList()); 

我发现使用addAll工作正常。

 ArrayList(String) copy = new ArrayList(String)(); copy.addAll(original); 

使用圆括号而不是generics语法

如果你想这样做,以便能够返回列表中的getter最好做:

 ImmutableList.copyOf(list); 

克隆ArrayLists时要非常小心。 在java中克隆很浅。 这意味着它只会克隆Arraylist本身而不是其成员。 所以,如果你有一个ArrayList X1并将其克隆到X2中,则X2中的任何更改都将在X1中显示,反之亦然。 当你克隆你只会生成一个新的ArrayList指针指向原始相同的元素。

我的函数克隆一个列表types为:

 public static <T extends Object> List<T> cloneList(List<T> list) { return ((List<T>) ((ArrayList<T>) list).clone()); } 

这也应该工作:

 ArrayList<String> orig = new ArrayList<String>(); ArrayList<String> copy = (ArrayList<String>) orig.clone() 

要克隆一个像java.util.List这样的通用接口,你只需要强制转换它。 在这里你是一个例子:

 List list = new ArrayList(); List list2 = ((List) ( (ArrayList) list).clone()); 

这是有点棘手,但它的工作原理,如果你是有限的返回一个List界面,所以任何人后,你可以实现你的列表,只要他想。

我知道这个答案接近最终答案,但我的答案回答了如何做到这一切,而你正在与List – 通用的父 – 而不是ArrayList

 ArrayList first = new ArrayList (); ArrayList copy = (ArrayList) first.clone (); 

我不是一个Java专业人士,但我有同样的问题,我试图解决这个方法。 (它假设T有一个拷贝构造函数)。

  public static <T extends Object> List<T> clone(List<T> list) { try { List<T> c = list.getClass().newInstance(); for(T t: list) { T copy = (T) t.getClass().getDeclaredConstructor(t.getclass()).newInstance(t); c.add(copy); } return c; } catch(Exception e) { throw new RuntimeException("List cloning unsupported",e); } }