metodo java generics clone

metodo - ¿Cómo puedo clonar una lista genérica en Java?



clone list java (14)

¿Por qué querrías clonar? Crear una nueva lista generalmente tiene más sentido.

List<String> strs; ... List<String> newStrs = new ArrayList<>(strs);

Trabajo hecho.

Tengo un ArrayList<String> que me gustaría devolver una copia. ArrayList tiene un método de clonación que tiene la siguiente firma:

public Object clone()

Después de llamar a este método, ¿cómo vuelvo a devolver el objeto devuelto a ArrayList<String> ?


Con Java 8 se puede clonar con una secuencia.

import static java.util.stream.Collectors.toList;

...

List<AnObject> clone = myList.stream().collect(toList());


Creo que esto debería funcionar con la API de colecciones:

Nota : el método de copia se ejecuta en tiempo lineal.

//assume oldList exists and has data in it. List<String> newList = new ArrayList<String>(); Collections.copy(newList, oldList);


Este es el código que uso para eso:

ArrayList copy = new ArrayList (original.size()); Collections.copy(copy, original);

La esperanza es útil para ti


Esto también debería funcionar:

ArrayList<String> orig = new ArrayList<String>(); ArrayList<String> copy = (ArrayList<String>) orig.clone()


Me parece que usar addAll funciona bien.

ArrayList(String) copy = new ArrayList(String)(); copy.addAll(original);

se usan paréntesis en lugar de la sintaxis genérica


Mi función para clonar una Lista con tipo:

public static <T extends Object> List<T> cloneList(List<T> list) { return ((List<T>) ((ArrayList<T>) list).clone()); }


No soy un profesional de Java, pero tengo el mismo problema e intenté resolverlo con este método. (Supongo que T tiene un constructor de copia).

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); } }


Para clonar una interfaz genérica como java.util.List , solo tendrá que emitirla. aquí eres un ejemplo:

List list = new ArrayList(); List list2 = ((List) ( (ArrayList) list).clone());

Es un poco complicado, pero funciona, si está limitado a devolver una interfaz de List , cualquiera puede implementar su lista cuando lo desee.

Sé que esta respuesta está cerca de la respuesta final, pero mi respuesta responde cómo hacer todo eso mientras trabajas con List , el padre genérico, no ArrayList


Si desea esto para poder devolver la Lista en un getter, sería mejor hacerlo:

ImmutableList.copyOf(list);


Tenga en cuenta que Object.clone () tiene algunos problemas importantes, y su uso se desaconseja en la mayoría de los casos. Consulte el Ítem 11, de " Java efectivo " de Joshua Bloch para obtener una respuesta completa. Creo que puedes usar Object.clone () de forma segura en matrices de tipo primitivo, pero aparte de eso, debes ser prudente sobre el uso y sobreescritura del clon. Probablemente sea mejor que defina un constructor de copia o un método de fábrica estático que clone explícitamente el objeto de acuerdo con su semántica.


Tenga mucho cuidado al clonar ArrayLists. La clonación en java es superficial. Esto significa que solo clonará el Arraylist en sí y no sus miembros. Entonces, si tiene un ArrayList X1 y lo clona en X2, cualquier cambio en X2 también se manifestará en X1 y viceversa. Cuando clones, solo generarás una nueva ArrayList con punteros a los mismos elementos en el original.


ArrayList first = new ArrayList (); ArrayList copy = (ArrayList) first.clone ();


ArrayList newArrayList = (ArrayList) oldArrayList.clone();