aldorenati ha scritto:
Oggetto copia_di_x = x;
Così non ti funzionerà mai. Questa è solo la copia del
valore del riferimento ... non è una creazione/duplicazione di un oggetto!!
aldorenati ha scritto:
concentriamoci sul costruttore di copia, perchè non entra mai
Il costruttore "di copia" (questo termine è preso in prestito più che altro dal C++ dove questa forma è più frequentemente usata) l'hai scritto, è quel:
public PilaArray(PilaArray p)
ma da quanto vedo, NON sta facendo la cosa giusta.
E se anche la facesse, nel tuo main() di test NON ne vedo l'uso di questo costruttore.
Il costruttore di copia (ammesso che faccia la cosa "giusta") lo devi invocare
esplicitamente tu, non esiste alcun meccanismo per cui possa essere invocato implicitamente!
PilaArray pilaOrig = new PilaArray( ...... );
PilaArray pilaCopia = new PilaArray(pilaOrig); // USI il costruttore di copia
aldorenati ha scritto:
e soprattutto cosa devo scrivere nel corpo perchè faccia ciò che desidero?
Va bene copiare dim/top. Va anche bene creare un nuovo array Object[] della dimensione originale.
Ma ... pensi che basta? E gli oggetti CONTENUTI nell'array del PilaArray originale??
Problema: PilaArray "vede" gli oggetti nell'array ovviamente solo come dei Object. Non "sa" di che tipo sono e non "sa" neanche quale è la parametrizzazione concreta che usi altrove (es. se fai un PilaArray<String> o un PilaArray<Date> ).
Inoltre, Object NON ha un clone() visibile (è protected infatti). E Cloneable è solo una interfaccia di "marcatura", non ha metodi (nemmeno il clone).
Morale della favola: è parecchio difficile clonare in modo "profondo" quell'array. Dovresti usare la reflection per andare a scoprire se ciascun oggetto nell'array originale possiede un clone() PUBBLICO e quindi invocarlo sempre tramite reflection. E' una cosa un po' "avanzata" ....
E' purtroppo lo stesso problema che hanno tutte le collection standard di Java. Sono clonabili ma il loro clone() fa solo una "shallow" copy. Il clone() di ArrayList ad esempio restituisce un NUOVO oggetto ArrayList con la sua struttura dati distinta. Ma i riferimenti agli oggetti sono solo copiati come valore del reference (come fare copia_di_x = x) e quindi non è una copia "profonda". Entrambi gli ArrayList, originale e copia, fanno riferimento agli stessi oggetti! Se però aggiungi/rimuovi qualcosa nel ArrayList originale, questa modifica NON la vedi nel ArrayList copia (e viceversa).
Si potrebbe risolvere solo se passi a PilaArray, in qualche modo, un "comportamento" (detto in senso generale) che "sa" come clonare un singolo elemento. Ovviamente è il chiamante che usa PilaArray che deve sapere poi cosa farci.
P.S.: hai fatto Pila/PilaArray come tipi "generici" ma poi non hai applicato i generics in modo appropriato e coerente.
P.S. 2: PilaPiena/PilaVuota che estendono java.lang.Error è davvero inappropriato.