J'ai une classe de base, disent Base
qui spécifie la méthode abstraite deepCopy
, et une myriade de sous-classes, dites A
, B
, C
... Z
. Comment puis-je définir deepCopy
afin que sa signature soit public X deepCopy()
pour chaque classe X
?Comment implémenter le clonage profond générique de type sécurisé dans une hiérarchie de classes Java?
Bon, maintenant, je:
abstract class Base {
public abstract Base deepCopy();
}
Malheureusement, cela signifie que si si j'ai un objet d'une sous-classe, dire a
de A
, alors je dois toujours effectuer une distribution non contrôlée pour une plus copie profonde spécifique:
A aCopy = (A) a.deepCopy();
Y at-il un moyen, peut-être en utilisant des génériques, pour éviter de lancer? Je veux garantir que toute copie en profondeur renvoie un objet de la même classe d'exécution. Edit: Permettez-moi d'étendre ma réponse car le typage covariant n'est pas suffisant. Dire, je voulais ensuite mettre en œuvre une méthode comme:
static <N extends Base> List<N> copyNodes(List<N> nodes) {
List<N> list = Lists.newArrayList();
for (N node : nodes) {
@SuppressWarnings("unchecked")
N copy = (N) node.deepCopy();
list.add(copy);
}
return list;
}
Comment puis-je éviter l'avertissement non contrôlé?
Il y a quelques utilitaires qui feront cela pour vous ... http://www.genericdeepcopy.com/ et http://code.google.com/p/cloning/. – Aaron