Каков правильный способ использовать метод, клонируйте, чтобы копировать список в Java?

Я хочу скопировать список в Java, и я нашел так называемый метод clone, который служит для этого, и функционирует хорошо, но я думаю, что я это не использую правильно, так как у меня выходит предупреждение в Затмении.

То, что я делаю, состоит в том, чтобы создавать список, я добавляю целое число, и в конце концов использую метод, чтобы копировать.

ArrayList<Integer> lista = new ArrayList<Integer>();
list.add(5);
ArrayList<Integer> listaCopiada = (ArrayList<Integer>) lista.clone();

Как кажется, была проблема, метод возвращает один Object, поскольку я имел, что castearlo, и сделав это, я функционирует, но у меня выходит предупреждение.

Type safety: Unchecked cast from Object to Арраилист <Integer>

Я могу выходить click на предупреждение и видеть многообразные решения, но ни одна не убеждает меня.

Локальный изменчивый Extract to:

Это удваивает линию, и тогда у меня выходит другое предупреждение того же типа.

ArrayList<Integer> clone = (ArrayList<Integer>) lista.clone();
ArrayList<Integer> clone2 = clone;
ArrayList<Integer> clone1 = clone2;
ArrayList<Integer> clone21 = clone1;
ArrayList<Integer> clone11 = clone21;

Extract to method:

Это делает мне частную функцию, у которой внутри есть линия с тем же предупреждением.

ArrayList<Integer> listaCopiada = extracted(lista);
private static ArrayList<Integer> extracted(ArrayList<Integer> lista) {
    return (ArrayList<Integer>) lista.clone();
}

Когда я пробую решать это предупреждение, у меня остается перекурсивная функция, что мне кажется достаточно нелогичным, так как он снимает часть клонирования.

private static ArrayList<Integer> extracted1(ArrayList<Integer> lista) {
    return extracted1(lista);
}

Add parentheses around cast:

Это добавляет мне бессмысленные скобки, и остается предупреждение.

ArrayList<Integer> listaCopiada = ((ArrayList<Integer>) lista.clone());

Подсказка, что расписка - дополнительный Remove parentheses, это состоит в том, чтобы возвращаться в как дела раньше.

Add SupressWarnings 'unchecked':

Это вынуждает меня использовать комментарий в код, говоря, что я не выстрелил себе предупреждение. Это единственный способ, из которого меня не вытекают больше предупреждение, но я думаю, что он остается уродливым.

@SuppressWarnings("unchecked")

Есть какой-то способ (если возможная официальная или правильная) использования clone без того, чтобы вышли предупреждения этого типа?

6
задан 10.10.2017, 18:19
4 ответа

Я evitarГ, - чтобы использовать clone. Если ты хочешь скопировать список, просто ты можешь делать это этой формой:

ArrayList<Integer> lista = new ArrayList<Integer>();
lista.add(5);
ArrayList<Integer> listaCopiada = new ArrayList<Integer>(lista);
3
ответ дан 24.11.2019, 12:19

На warning, единственный способ elimintarlo - используя аннотацию @SupressWarnings. Это происходит, потому что ты делаешь casteo в характерный тип. В Java, не существует другой способ делать casteo вниз объект, определенный с характерными (в этом случае, Object в ArrayList<Integer>) и удалять предупреждение. У него нет ничего из дьявола в использовании @SupressWarnings, всякий раз когда ты узнал то, что ты делаешь. В случае, что ты перемещал характерного, у тебя вышел бы другой warning использования сырых переменных (raw type), и в любом случае ты был бы должен добавлять эту аннотацию.


Метод clone это бедная попытка Java, чтобы помогать главный файл prototype. Я говорю, что он бедный, потому что он технически не предлагает много стоимость и только - поверхностная копия. Только есть мало случаев, где было бы нужно звонить в метод, клонируйте, как в договоренности.

Для твоего случая, если ты только хочешь поверхностную копию с новым списком с теми же объектами, а именно, который, если ты изменяешь состояние одного объекты нового списка также, увидит изменение состояния в первоначальном списке (потому что это тот же объект), тогда будь достаточен следующего:

List<Integer> copia = new ArrayList<>(listaOrigen);

Если то, что ты ищешь, является глубокой копией, а именно, что даже объекты в новом списке были отличными от тех оригинала, и каждый поддержал его собственное состояние, ты будешь должен обеспечивать себе, что каждый элемент внутри твоего первоначального списка был неизменным, или что они осуществляли их собственный метод клонировавший глубоко как строитель копии, serialización/deserialización или другой.

7
ответ дан 24.11.2019, 12:19

Нет способов удалять warning, который не выводя этот тип сообщений из строя.

clone будет возвращать тебе элемент типа Object и это что-то, что ты не будешь мочь изменять.

Альтернатива состоит в том, чтобы прекращать использовать clone и делать копию объекта используя строитель копирует:

ArrayList<Integer> listaCopiada =  new ArrayList<Integer>(lista);
3
ответ дан 24.11.2019, 12:19

Ты можешь использовать класс java.util.Collections:

List<String> listaCopia = new ArrayList<String>(listaOriginal.size());
Collections.copy(listaCopia, listaOriginal);

или самый общий метод:

List<String> listaCopia = new ArrayList<String>(listaOriginal);
3
ответ дан 24.11.2019, 12:19

Теги

Похожие вопросы