Как создать новый список того же типа, что и старый список в Java? - PullRequest
2 голосов
/ 27 февраля 2011

Я пытаюсь написать метод, который принимает List и создает на его основе новый List того же типа. То есть, если список ввода - ArrayList, то я хочу, чтобы метод создал новый ArrayList. Проблема в том, что программа не будет знать, является ли List ArrayList или LinkedList до времени выполнения.

До сих пор я пытался использовать метод clone(), но я не думаю, что он работает, потому что класс List не определен clone(), и когда я приводил список ввода как Object и затем клон, затем преобразовать в список, он также не работает (я не уверен, почему).

Ответы [ 3 ]

2 голосов
/ 27 февраля 2011

Все стандартные списки из клона поддержки JDK, поэтому

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

должно работать нормально.

Конечно, вы можете использовать отражение

Class c = somelist.getClass();
List newlist = (List)c.newInstance();
newlist.addAll(somelist);
1 голос
/ 27 февраля 2011

Можете ли вы сказать больше о том, почему вы хотите это сделать?Без хорошего обоснования я бы сказал:

Не стоит делать это вообще, а вместо этого:

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

Если то, что вы действительно хотите, - это эффективный способ создания второй копииизвестный список, может быть, базовый тип реализации действительно не имеет значения.В этом случае просто используйте ArrayList, который можно эффективно выделить с помощью конструктора копирования List.

0 голосов
/ 07 мая 2016

Вот оно:

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