Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-03-2007, 10:49   #1
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
[java] interfaccia Cloneable

Non riesco a capire a cosa potrebbe servire l'interfaccia Cloneable!

non ha nessun metodo, e inoltre sembra che tutte le classi la estendano!!!
o mi sbaglio??!!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 11:09   #2
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Come dicono le specifiche, se una classe non estende l'interfaccia "Cloneable", non è possibile invocare il metodo "clone()" della classe Object, che tutti gli oggetti naturalmente ereditano.

Il metodo "clone()" (ma dalla tua domanda penso che tu lo sappia già) serve per tutti i casi in cui si voglia ottenere una "copia di lavoro" di un'oggetto su cui operare senza alterare il contenuto dell'originale: altrimenti, ricordando che ciò che viene passato nelle chiamate ai metodi è un riferimento all'oggetto stesso (salvo il caso dei tipi elementari), qualsiasi azione che ne alteri lo stato risulterà "visibile" anche su tutti i dententori dei riferimenti all'oggetto medesimo, con conseguenze spesso indesiderabili.

Il metodo "clone()" della classe Object inoltre è un metodo generico di copia degli oggetti, e in quanto tale non è adatto a tutte le tipologie di classi che si possono creare: è meglio, in caso di incertezza, fare l'override del metodo clone nella classe che implementa l'interfaccia Cloneable, in maniera che la copia sia "informata" della struttura dell'oggetto che sta copiando e pertanto la procedura sia al contempo corretta e completa.
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 15:33   #3
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
clone su E

ok... ma se devo clonare un oggetto generico? ad esempio :
ho un dato definito così
E elemento1
che viene inizializzato nel main, e devo fare un clone di elemento1 e metterlo in elemento2. Come si fa?
il compilatore mi dice che clone è definito protected in Object (giustamente), ma allora come faccio ad usare clone() su elemento1 ?
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 09:19   #4
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Quote:
Originariamente inviato da massib86 Guarda i messaggi
ok... ma se devo clonare un oggetto generico? ad esempio :
ho un dato definito così
E elemento1
che viene inizializzato nel main, e devo fare un clone di elemento1 e metterlo in elemento2. Come si fa?
il compilatore mi dice che clone è definito protected in Object (giustamente), ma allora come faccio ad usare clone() su elemento1 ?
Forse il tuo problema è che non conosci il tipo di E a runtime, cioè non sai se E implementi o meno Cloneable?

Oppure "E" è un tipo generico?
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 10:09   #5
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
la seconda!... "E" è un tipo generico (i generics...)
Questo problema mi sta facendo impazzire!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 10:38   #6
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Boh... non potresti semplicemente provare a clonare l'oggetto e lanciare la "CloneNotSupportedException" in caso che E non sia Cloneable?

Il fatto è che, o sei sicuro per le tue specifiche che ogni E è Cloneable oppure può darsi che qualche E non lo sia: in tal caso sarebbe corretto informare l'utilizzatore dell'errore. Sul come poi, vedi tu...
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 11:31   #7
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
ho già provato a fare così, ma siccome E è generico il compilatore mi da errore dicendomi che E non può utilizzare la clone di Object perchè protected... (il programma non si eseguirà mai così!!)

inoltre se faccio un instanceof Clonable sull'oggetto di tipo E per vedere se implementa l'interfaccia, mi dà sempre una risposta positiva (in quanto l'interfaccia Cloneable non contiene nessun metodo), quindi mi eseguira la clone() anche se è un oggetto che non sovrascrive il metodo!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 11:57   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da massib86 Guarda i messaggi
siccome E è generico il compilatore mi da errore dicendomi che E non può utilizzare la clone di Object perchè protected... (il programma non si eseguirà mai così!!)
Credo che l'unica soluzione sia usare la "reflection". Prendi la classe dell'oggetto "generico", cerchi il metodo "clone" e se c'è lo invochi.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 12:31   #9
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Quote:
Originariamente inviato da massib86 Guarda i messaggi
ho già provato a fare così, ma siccome E è generico il compilatore mi da errore dicendomi che E non può utilizzare la clone di Object perchè protected... (il programma non si eseguirà mai così!!)

inoltre se faccio un instanceof Clonable sull'oggetto di tipo E per vedere se implementa l'interfaccia, mi dà sempre una risposta positiva (in quanto l'interfaccia Cloneable non contiene nessun metodo), quindi mi eseguira la clone() anche se è un oggetto che non sovrascrive il metodo!
O fai come ha detto andbin, oppure forse questo codice ti dovrebbe dare, male che vada, una ClassCastException:

Codice:
elemento2 = (E)((Cloneable)elemento1).clone();
Non sono sicuro che funzioni però...
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 14:41   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Le classi che concretizzano cloneable non sono poi tantissime. Il fatto che non abbia metodi non significa che tutti quanti siano dei Cloneable. E' un marcatore puro, tipo EventListener.

Dichiara E sottotipo di Cloneable e poi usa la clonazione standard.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 16:56   #11
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
finalmente ho risolto il problema!!
grazie a Andbin ho usato le reflection e tutto si è risolto...
usare il cast a clonable provocava sempre un errore al compilatore in quanto Cloneable non ha alcun metodo (e quindi neanche clone())..

massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 17:41   #12
Mixmar
Senior Member
 
L'Avatar di Mixmar
 
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Le classi che concretizzano cloneable non sono poi tantissime. Il fatto che non abbia metodi non significa che tutti quanti siano dei Cloneable. E' un marcatore puro, tipo EventListener.

Dichiara E sottotipo di Cloneable e poi usa la clonazione standard.
[Riflessione Pseudo-filosofica sul linguaggio]
Quindi si potrebbe considerare "Cloneable" un annotation "sui generis" (mi verrebbe da dire "ante litteram") un po' come il modificatore transient?
[/Riflessione Pseudo-filosofica sul linguaggio]
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur
Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N
Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN
Mixmar è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 17:46   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Io ho provato a fare così:
Codice:
import java.lang.reflect.*;
import java.io.*;
import java.util.*;

public class Prova
{
    public static void main (String[] args)
    {
        try
        {
            // Date e` clonabile
            Contenitore<Date> c = new Contenitore<Date> (new Date ());
            Contenitore<Date> c2 = (Contenitore<Date>) c.clone ();
        }
        catch (Exception e)
        {
            System.out.println (e);
        }

        try
        {
            // File non e` clonabile
            Contenitore<File> c = new Contenitore<File> (new File ("prova"));
            Contenitore<File> c2 = (Contenitore<File>) c.clone ();
        }
        catch (Exception e)
        {
            System.out.println (e);
        }
    }
}


class Contenitore<T> implements Cloneable
{
    private T var;

    public Contenitore (T var)
    {
        this.var = var;
    }

    public Object clone ()
        throws CloneNotSupportedException
    {
        Contenitore<T> newobj = (Contenitore<T>) super.clone ();

        if (var != null)
            newobj.var = (T) cloneObj (var);

        return newobj;
    }

    private Object cloneObj (Object o)
        throws CloneNotSupportedException
    {
        try
        {
            Class<?> cl = o.getClass ();
            Method m = cl.getMethod ("clone", new Class[0]);
            return m.invoke (o, new Object[0]);
        }
        catch (NoSuchMethodException e)
        {
            throw new CloneNotSupportedException ();
        }
        catch (IllegalAccessException e)
        {
            throw new CloneNotSupportedException ();
        }
        catch (InvocationTargetException e)
        {
            throw new CloneNotSupportedException ();
        }
    }

    public T getVar ()
    {
        return var;
    }

    public void setVar (T var)
    {
        this.var = var;
    }
}
È corretto ciò che ho fatto?? Aspetto conferme (specialmente da PGI-Bis )
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 19:10   #14
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
anche secondo me... Cloneable non è altro che una descrizione/proprietà di una classe con la quale si dice che dentro è sovrascritto il metodo clone (messo public anzichè di private). Per il resto l'interfaccia non ha niente dentro; mi viene da pensare che sia molto simile ad una classe astratta!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 19:14   #15
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
Quote:
Originariamente inviato da andbin Guarda i messaggi
Io ho provato a fare così:


È corretto ciò che ho fatto?? Aspetto conferme (specialmente da PGI-Bis )


anche io ho fatto praticamente così, mi sembra la cosa più giusta!!!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 20:56   #16
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Potreste usare:

public class Contenitore<T extends Cloneable> implements Cloneable {...

Formalmente questo assicura che la clonazione di T non produca mai una CloneNotSupportedException (ammesso che chi ha scritto la classe T che implementa Cloneable rispetti lo standard della clonazione in Java).

Per invocare un metodo pubblico senza argomenti:

val.getClass().getMethod("clone").invoke(val);

Continuo a preferire il costruttore di copie .
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 23:16   #17
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Potreste usare:

public class Contenitore<T extends Cloneable> implements Cloneable {...

Formalmente questo assicura che la clonazione di T non produca mai una CloneNotSupportedException (ammesso che chi ha scritto la classe T che implementa Cloneable rispetti lo standard della clonazione in Java).

Per invocare un metodo pubblico senza argomenti:

val.getClass().getMethod("clone").invoke(val);

Continuo a preferire il costruttore di copie .
Si può usare tranquillamente <T extends Cloneable>, ma in questo caso farlo o meno non cambia assolutamente niente visto che il controllo che esista una classe clone sovrascritta lo si fà nella reflection!
Grazie cmq di avermi detto come si invoca il metodo pubblico senza argomenti!
massib86 è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2007, 00:10   #18
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Preciso a scanso di equivoci ma è solo una formalità. L'invocazione riflessiva che ho incollato è, per via dei varargs, uguale a quella di andbin. Non ci sono due modi per invocare un metodo pubblico. Ce n'è uno solo .

Introducendo un limite nella dichiarazione del tipo generico ottieni un controllo di compatibilità in compilazione. C'è tutta la diatriba sulla tip(azione/izzazione) statica dietro e se andiamo in giro declamando "tanto il controllo lo fa in esecuzione" c'è il rischio che volino coltellate tra le scapole. Io parteggio per il versante dinamico ma occhi aperti che gli statici son agguerriti .
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2007, 09:10   #19
massib86
Junior Member
 
Iscritto dal: Mar 2007
Messaggi: 22
meglio aggiungerlo allora... cosi' il codice mi diventa piu' robusto!!
massib86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Tutte le offerte Amazon di oggi: 13 novi...
CD Projekt RED punta sull'Intelligenza A...
Offerte Oral-B iO su Amazon: spazzolini ...
Consegne sempre più rapide: Amazo...
Epic introduce l'anticheat di livello ke...
Google Gemini sfruttato da hacker di Sta...
Braun taglia i prezzi su Amazon: dai ras...
Helldivers al cinema: Jason Momoa nel ca...
Gli occhiali AI fanno volare EssilorLuxo...
Elon Musk riorganizza xAI dopo l'addio d...
Upgrade del PC al prezzo giusto: su Amaz...
Anthropic, si dimette il leader della si...
Applied Materials patteggia con gli USA:...
Addio telefoni a conchiglia: il 2026 sar...
Blizzard introduce una nuova classe in D...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:27.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v