Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [JAVA] Clone di oggetto

    Io ho una classe MyBigInteger e vorrei realizzare un metodo equals che compari un oggetto di tipo BigInteger(quello della libreria standard di java) oppure MyBigInteger con un altro di tipo MyBigInteger.
    Per fare ciò dovrei creare il metodo:
    codice:
    public boolean equals(Object o){
    }
    Tralasciando i controlli necessari a verificare l'uguaglianza, se eseguo i metodi del BigInteger su o mi viene restituito errore, perché o è un oggetto generico.
    Come posso fare a trattarlo come BigInteger/MyBigInteger? Ovviamente supponendo che entrambe le classi abbiano metodi con lo stesso nome e che restituiscano le stesse cose.

    Detto in altri termini, al posto di Object potrebbe esserci sia un oggetto di tipo MyBigInteger, sia uno di tipo BigInteger. Da comparare con un altro oggetto che sia di uno dei due tipi.

    Può essere d'aiuto un metodo clone? Invocato su o, però, non funziona perché viene utilizzato il clone() di Object (che tra l'altro è privato).
    codice:
    public MyBigInteger clone() throws CloneNotSupportedException{
    	return (MyBigInteger )super.clone();
    }
    Spero di essermi fatto capire, nel caso chiedete

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non ho ben capito se il problema sia il metodo equals() o il metodo clone().
    Visto che l'argomento (come da titolo) riguarda il secondo, cerco di fare luce sul secondo... il primo l'avrei risolto in maniera decisamente diversa, tramite l'operatore instanceof.

    Per poter clonare un oggetto esso deve implementare l'interfaccia Cloneable.

    Questa interfaccia non prevede l'implementazione di alcun metodo (come Serializable), ma permette alla JVM di capire che quell'oggetto può essere replicato.

    Prima di poter richiamare il metodo clone() su un qualsiasi oggetto, quindi, esso deve essere Cloneable.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Ahh no in effetti il problema è più che altro sull'equals..non sapevo bene se potesse servire il clone per risolvere il problema. Mi potresti spiegare come utilizzare l'istanceof per risolvere il primo problema, a questo punto??

    Dovrei fare qualcosa tipo
    codice:
    if (o istanceof(BigInteger)||o istanceof(MyBigInteger))
     //controlla
    else return false
    ??
    In questo caso i metodi utilizzati su o vengono riconosciuti come metodi di BigInteger/MyBigInteger invece che metodi di Object?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Nota bene: l'unica cosa che puoi fare è questa
    codice:
    MyBigInteger intero1 = ...;
    MyBigInteger intero2 = ...;
    if ( intero1.equals( intero2 ) ) {
       ...
    }
    oppure
    codice:
    MyBigInteger intero1 = ...;
    BigInteger intero2 = ...;
    if ( intero1.equals( intero2 ) ) {
       ...
    }
    ma assolutamente non questa
    codice:
    BigInteger intero1 = ...;
    MyBigInteger intero2 = ...;
    if ( intero1.equals( intero2 ) ) {
       ...
    }
    Per poter effettuare una delle due operazioni ammissibili, è necessario ridefinire il metodo equals() di MyBigInteger in questo modo:
    codice:
    public boolean equals(Object obj) {
       boolean result = false;
       if(obj instanceof MyBigInteger) {
          // Qui stai confrontando il tuo MyBigInteger con un altro oggetto di tipo MyBigInteger
          ...   // Controlli di uguaglianza
       } else {
          if(obj instanceof BigInteger) {
             // Qui stai controntando il tuo MyBigInteger con un oggetto BigInteger
             ...   // Controlli di uguaglianza
          }
       }
       return result;
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Ah chiarissimo
    Non capisco però come risolvere questo problema:

    codice:
    public boolean somma(Object obj) {
       if(obj instanceof MyBigInteger) {
           obj.add(5);
       }
    }
    Insomma, se è un'istanza di MyBigInteger utilizzo un metodo della classe MyBigInteger.
    Ma se faccio in questo modo, mi viene detto che non è stato trovato il metodo add nella classe Object

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Eh già... prima di operare sull'oggetto lo devi castare:
    codice:
    public boolean somma(Object obj) {
       if(obj instanceof MyBigInteger) {
          ((MyBigInteger) obj).add(5);
       }
    }
    Per il compilatore, infatti, l'oggetto obj è di tipo Object. Sei tu che, dopo averne testato il tipo, devi dirgli esplicitamente di che tipo di oggetto si tratta.
    Un modo alternativo è questo:

    codice:
    public boolean somma(Object obj) {
       if(obj instanceof MyBigInteger) {
          MyBigInteger intero = (MyBigInteger) obj;
          intero.add(5);
       }
    }
    Sono equivalenti.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Ah ecco!!!
    Grazie infinite, mi sei stato utilissimo!!!!!!!


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.