Casting d'ArrayList, bug de compilateur ?

pumbaa666 Messages postés 24 Date d'inscription jeudi 12 juin 2003 Statut Membre Dernière intervention 19 janvier 2010 - 15 déc. 2007 à 13:36
 Utilisateur anonyme - 15 déc. 2007 à 19:27
Bonjour, j'ai un gros problème, j'essaye de
faire une méthode générique qui clone en profondeur une ArrayList (donc
qui clone chaque objet, pas seulement la liste elle-même) mais je
n'arrive pas à le faire "proprement".

Voici une partie de mon programme :

/* L'interface */

public interface MyClonable

{

public MyClonable myClone();

}

/* La classe qui implémente l'interface */

public class Process implements MyClonable

{

public Process(Process source)

{

/* bla bla */

}

public Process myClone()

{

return new Process(this);

}

}

/* La méthode de clonage proprement dite */

public class Tools

{

public static ArrayList<MyClonable> deepClone(ArrayList<MyClonable> source)

{

ArrayList<MyClonable> clone = new ArrayList<MyClonable>(source.size());

for(MyClonable o:source)

clone.add(o.myClone());

return clone;

}

}

/* L'utilisation */

ArrayList<MyClonable> listSource = {...}; // Elle est déjà pleine

ArrayList listProcess = Tools.deepClone(listSource);

/* Problème : le compilateur me retourne : "The method
deepClone(ArrayList<MyClonable>) in the type Tools is not
applicable for the arguments (ArrayList)"*/

Et je ne comprends pas du tout pourquoi. Avec un pote nous avons essayé de nombreuses idées, mais rien ne marche.

De tête nous avons testé :

- un casting : ArrayList listProcess =
Tools.deepClone((ArrayList<MyClonable>)listProcess); -->
Erreur, impossible de caster

- définir autrement le prototype de la méthode de clonage : public
static ArrayList<? extends MyClonable> deepClone(ArrayList<?
extends MyClonable> source) --> Erreur, Type mismatch: cannot
convert from ArrayList<capture#1-of ? extends MyClonable> to
ArrayList

- plein d'autres trucs.

Le seul qui marche, c'est de ne mettre nul part le type de la collection : public static ArrayList deepClone(ArrayList source)

mais ça me met des warning partout (dans le prototype de la fonction, et dans son appel.

Auriez-vous une solution plus belle svp ?

D'avance merci

Pumbaa

3 réponses

Utilisateur anonyme
15 déc. 2007 à 19:08
Ca te met cette erreur car MyClonable est une interface.

TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
pumbaa666 Messages postés 24 Date d'inscription jeudi 12 juin 2003 Statut Membre Dernière intervention 19 janvier 2010
15 déc. 2007 à 19:22
J'ai cité 3 erreurs, tu me parles de laquelle ?
Si c'est de la 1ère, je ne vois pas le problème. Une ArrayList d'interface ça ne peut pas exister, il le prend forcément comme une ArrayList d'objet respectant cette interface.

[green]Pumbaa/green
0
Utilisateur anonyme
15 déc. 2007 à 19:27
"The method
deepClone(ArrayList<MyClonable>) in the type Tools is not
applicable for the arguments (ArrayList)"



TUER : http://tuer.tuxfamily.org/tuer.php

yeah! vive java
0
Rejoignez-nous