Copia di un oggetto di tipo generico

di il
4 risposte

Copia di un oggetto di tipo generico

Salve a tutti,
come da titolo ho problema nella "clonazione" di un oggetto di tipo T in un metodo generico anch'esso di tipo T.
Il problema sta nel fatto che avrei bisogno di effettuare una copia dell'oggetto di una qualsiasi classe vista come tipo generico T, la quale non è clonabile, in un nuovo oggetto di tipo T.
Più o meno come fa la class Arrays con il metodo copyOf(), tuttavia avrei bisogno di un nuovo oggetto di tipo T copiato da un altro dello stesso tipo.
Spero di essermi spiegato per bene e che la mia domanda sia corretta, sia dal significato che dal possibile senso del problema.
Grazie mille in anticipo.

4 Risposte

  • Re: Copia di un oggetto di tipo generico

    Di per sé non puoi. Nel senso che clone() in Object è definito come protected e solo una sottoclasse specifica ha facoltà di ridefinirlo andando anche ad "aprire" il livello di accesso a public.
    Quindi solo avendo il reference ad un tipo specifico, se ha il clone() pubblico, esso è invocabile. Detto in altro modo, neanche se avessi un reference di tipo Object potresti invocare il clone!

    Ma un T (type variable) NON è un tipo concreto .. solo un "segnaposto", che poi per via della "erasure" nel bytecode diventa del tipo del suo "bound", se non ce n'è uno esplicito, è proprio Object.

    Visto che la domanda è strana e inusuale, invece che chiedere come clonare un oggetto di tipo T, dovresti precisare prima PERCHÉ.
    Perché probabilmente stai vedendo il problema dal lato "sbagliato" ...
  • Re: Copia di un oggetto di tipo generico

    Si si sono perfettamente d'accordo con la tua spiegazione,
    non vorrei aver fatto una domanda senza senso, in pratica io ho estratto il mio problema da alcune classi di java.
    Da come ho osservato, spero non in modo sbagliato, le classi ArrayList e LinkedList di java che sono di tipo generico se istanziate come oggetto, all'invio del comando della add di un oggetto ne inseriscono uno completamente nuovo esempio:
    
    ArrayList<Integer> ai = new ArrayList<>();
    Integer i = new Integer(11);
    ai.add(i);
    
    Ovvero prendendo l'elemento in posizione 0 dell'ArrayList e l'oggetto i sono due oggetti distinti. Il perchè dipende dal fatto che è un intero o qualsiasi altra classe che permette di instanziare oggetti all'interno di queste Collezioni si comportano allora stesso modo? Ovvero l'ultima domanda si riferisce al fatto che se istanzio un oggetto di una qualsiasi classe e ne faccio la add, se confronto l'oggetto nell'ArrayList e l'oggetto stesso risulteranno diversi o sbaglio?

    Aggiungo un ulteriore esempio per farti capire meglio:
    
    ArrayList<String> ai= new ArrayList<>();
    ai.add("aaaa");
    ai.add("bbbb");
    ai.add("cccc");
    ai.add("dddd");
    String s1 = new String("eeee");
    ai.add(s1);
    System.out.println(ai);
    s1 = new String("ffff");
    System.out.println(ai);
    
    Con output:
    [aaaa, bbbb, cccc, dddd]
    [aaaa, bbbb, cccc, dddd, eeee]
    [aaaa, bbbb, cccc, dddd, eeee]

    Spero che tramite questo esempio tu capisca la mia domanda, ovvero se l'ArrayList<String> ha come ultimo elemento l'elemento s1, come riesce l'ArrayList<T> a capire come clonare quella Stringa s1?
  • Re: Copia di un oggetto di tipo generico

    Whowas ha scritto:


    Da come ho osservato, spero non in modo sbagliato, le classi ArrayList e LinkedList di java che sono di tipo generico se istanziate come oggetto, all'invio del comando della add di un oggetto ne inseriscono uno completamente nuovo esempio:
    ??? no.

    Whowas ha scritto:


    
    ArrayList<Integer> ai = new ArrayList<>();
    Integer i = new Integer(11);
    ai.add(i);
    
    Ovvero prendendo l'elemento in posizione 0 dell'ArrayList e l'oggetto i sono due oggetti distinti.
    No, sei proprio fuori strada.

    Nel codice sopra ci sono sostanzialmente 2 oggetti: 1 oggetto ArrayList e 1 oggetto Integer. All'interno del ArrayList c'è banalmente un array e quando fai ai.add(i) il valore del reference i viene semplicemente copiato in un elemento di questo array, diciamo che avviene qualcosa del tipo arrayinterno[0] = i;

    Viene copiato il valore del reference ... NON viene "clonato" l'oggetto nel senso di crearne un altro!!

    Tanto è vero che:
    ArrayList<Integer> ai = new ArrayList<>();
    Integer i = new Integer(11);
    ai.add(i);
    Integer i2 = ai.get(0);
    
    System.out.println(i == i2);   // stampa true  !!
    I due reference sono UGUALI. Stesso reference = stesso identico oggetto.
  • Re: Copia di un oggetto di tipo generico

    Si si esatto, perdonami per le stupide domande mi ero confuso per un attimo, quella cosa succede perchè sono in aliasing esatto? Quindi era un errore mio dal punto di vista dei ragionamenti, mi ero un po confuso grazie mille
Devi accedere o registrarti per scrivere nel forum
4 risposte