如何在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); } }