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

Tengo un ArrayList 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 ?

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

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

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

Trabajo hecho.

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

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.

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 newList = new ArrayList(); Collections.copy(newList, oldList); 

Con Java 8 se puede clonar con una secuencia.

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

 List clone = myList.stream().collect(toList()); 

Me parece que usar addAll funciona bien.

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

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

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

 ImmutableList.copyOf(list); 

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

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.

Esto también debería funcionar:

 ArrayList orig = new ArrayList(); ArrayList copy = (ArrayList) orig.clone() 
 ArrayList first = new ArrayList (); ArrayList copy = (ArrayList) first.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  List clone(List list) { try { List 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); } }