2010-02-13 9 views
1

J'ai une classe qui implémente un 2Dtable. Les éléments de la table sont génériques. Et la table est stockée comme ceci:Clone d'implémentation Java, classe générique.

public Object[][] list; 

Le problème est qu'appeler le clone sur ceci apparemment ne fonctionne pas. Notez que mon testcase initialise la table pour stocker les entiers normaux.

Tabell2D<Integer> en = new Tabell2D<Integer>(5,5); 
     en.sett(0, 0, 55); 
     Tabell2D<Integer> to = en.clone(); 
     to.sett(0, 0, 11); 
     assertTrue(en.equals(to)); 

Ici, je fais une table. Changez-le, clonez-le. Changez le clone et comparez-les. Évidemment, le clone est changé. Même ainsi, cet assertTrue est bien vrai.

Procédé égale est produite par éclipse:

public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Tabell2D other = (Tabell2D) obj; 
     if (bredde == null) { 
      if (other.bredde != null) 
       return false; 
     } else if (!bredde.equals(other.bredde)) 
      return false; 
     if (høyde == null) { 
      if (other.høyde != null) 
       return false; 
     } else if (!høyde.equals(other.høyde)) 
      return false; 
     if (!Arrays.equals(liste, other.liste)) 
      return false; 
     return true; 
    } 

Je suppose que le problème est soit dans la comparaison de la variable de liste dans égales, ou le problème dans le procédé de clonage. méthode Clone: ​​

public Tabell2D<E> clone(){ 
     Tabell2D<E> nyTab = new Tabell2D<E>(this.bredde,this.bredde); 
     nyTab.liste = liste.clone(); 
     return nyTab; 
    } 
+0

Cette question peut avoir quelques réponses utiles, ils parlent aussi, et proposent des méthodes, pour les copies de tableau en profondeur: http://stackoverflow.com/questions/419858/how-to-deep-copy-an-irregular -2d-array –

Répondre

2

Je pense que la racine du problème est que le clonage d'un tableau 2d ne va pas profond. Si vous voulez une copie complète de 'liste', vous devez écrire votre propre code pour copier chaque ligne (ou colonne selon la façon dont vous le regardez).

+0

Je vais essayer, merci! – Algific

+0

Cela a fonctionné! Transfert manuel de chaque élément dans la table. Et j'avais aussi besoin d'une méthode d'égalisation personnalisée, celle générée par eclipse ne fonctionnait pas. – Algific

-2

Clone est censé retourner l'objet. Votre "clone" ne remplace pas le normal.

En outre, je ne sais pas que le clonage d'un tableau effectue une copie en profondeur. Vous feriez probablement mieux de créer un nouveau tableau et d'assigner les éléments.

+0

Donc mon professeur serait un ... pour inclure ceci: public abstract ITabell2D clone(); dans l'interface Tabell2D? – Algific

+0

Il devrait l'appeler autrement. –

+0

professeur? Je ne comprends pas. – bmargulies

Questions connexes