我正在尝试编写一个方法,该方法接收List
并根据它创建相同类型的新List
。也就是说,如果输入列表是ArrayList
,那么我希望该方法创建一个新的ArrayList
。问题是程序在运行时之前不会知道List是ArrayList
还是LinkedList
。
到目前为止,我已尝试使用clone()
方法,但我认为它不起作用,因为List类没有定义clone()
,当我将输入列表转换为Object
然后克隆然后重新制作为List,它也不起作用(我不知道为什么)。
答案 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);