Domanda

Ho un ArrayList<String> che vorrei restituire una copia. ArrayList è un metodo clone che ha la seguente firma:

public Object clone()

Dopo che l'ho chiamata di questo metodo, come faccio cast l'Oggetto restituito indietro ArrayList<String>?

È stato utile?

Soluzione

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

Altri suggerimenti

Perché si vuole clonare?La creazione di un nuovo elenco di solito rende più senso.

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

Lavoro fatto.

Questo è il codice che uso per che:

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

La speranza è utile per voi

Con Java 8 non può essere clonato con un flusso.

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

...

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

Essere informati che l'Oggetto.clone() ha alcuni importanti problemi, e il suo uso è sconsigliato nella maggior parte dei casi.Si prega di vedere l'Articolo 11, dal "Efficace Java"Joshua Bloch per una risposta completa.Credo che si può tranquillamente utilizzare l'Oggetto.clone() sui tipi primitivi array, ma a parte che avete bisogno per essere giudizioso sul corretto uso e l'override di clone.Si sono probabilmente meglio la definizione di un costruttore di copia o di un factory statico metodo che esplicitamente cloni l'oggetto secondo la vostra semantica.

Credo che questo dovrebbe fare il trucco con le Collezioni di API:

Nota:il metodo di copia viene eseguito in un tempo lineare.

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

Trovo che usare addAll funziona bene.

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

le parentesi sono piuttosto generici sintassi

Se si desidera che questo per essere in grado di restituire l'Elenco in un getter sarebbe meglio fare:

ImmutableList.copyOf(list);

Per clonare una interfaccia generica come java.util.List avrete solo bisogno di eseguire il cast.eccovi un esempio:

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

È un po ' complicato, ma funziona, se si sono limitati a restituire un List l'interfaccia, in modo che chiunque, dopo che è possibile implementare la vostra lista ogni volta che vuole.

So che questa risposta è vicino alla risposta finale, ma la mia risposta risposte come fare tutto questo, mentre si sta lavorando con List -il padre generica - non ArrayList

Essere molto attenti quando clonazione ArrayLists.La clonazione in java è poco profondo.Questo significa che solo clone Arraylist e non i suoi membri.Quindi, se si dispone di un ArrayList X1 e clone in X2 qualsiasi cambiamento in X2 si manifesterà anche in X1 e viceversa.Quando si clona è solo generare un nuovo ArrayList con i puntatori agli elementi in originale.

Questo dovrebbe funzionare:

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

Io non sono un java professionale, ma ho lo stesso problema e ho provato a risolvere con questo metodo.(Si supponga che T ha un costruttore di 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);
      }
}
List<String> shallowClonedList = new ArrayList<>(listOfStrings);

Tenete a mente che questo è solo un fondale basso e non una copia profonda, vale a dire.si ottiene un nuovo elenco, ma le voci sono le stesse.Questo non è un problema semplicemente di stringhe.Ottenere più difficile quando le voci dell'elenco sono gli oggetti stessi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top