如何在Java中创建与旧列表相同类型的新列表?

时间:2011-02-27 03:47:11

标签: java list generics clone

我正在尝试编写一个方法,该方法接收List并根据它创建相同类型的新List。也就是说,如果输入列表是ArrayList,那么我希望该方法创建一个新的ArrayList。问题是程序在运行时之前不会知道List是ArrayList还是LinkedList

到目前为止,我已尝试使用clone()方法,但我认为它不起作用,因为List类没有定义clone(),当我将输入列表转换为Object然后克隆然后重新制作为List,它也不起作用(我不知道为什么)。

3 个答案:

答案 0 :(得分:2)

JDK支持克隆的所有标准列表,所以

List copy = (List)((Cloneable)somelist).clone()

应该可以正常工作。

当然你可以使用反射

Class c = somelist.getClass();
List newlist = (List)c.newInstance();
newlist.addAll(somelist);

答案 1 :(得分:1)

你能说更多关于你为什么要这样做的事吗?如果没有一个好的理由,我会争辩说:

考虑不要这样做,而是:

static <T> List<T> cloneMyList(final List<T> source)
{
  return new ArrayList<T>(source);
} 

如果您真正想要的是创建已知列表的第二个副本的有效方法,那么底层实现类型可能无关紧要。在这种情况下,只需使用ArrayList即可使用List复制构造函数进行有效分配。

答案 2 :(得分:-1)

这是:

List<YourType> destinationList = new ArrayList<>(sourceList.size());
Collections.copy(destinationList, sourceList);