2010-09-15 11 views
3

J'ai deux vecteurs déclarés comme une propriété privée de classe:Impossible jeter les avertissements Java quand le vecteur de clonage

private Vector<Myobject> v1 = new Vector<Myobject>(); 
private Vector<Myobject> v2 = new Vector<Myobject>(); 

je remplis v1 avec un tas de MyObjects. Je dois faire un clone superficiel de v1 à v2. J'ai essayé:

v2 = v1.clone(); 

Je reçois des "opérations non contrôlées ou dangereuses".

J'ai essayé toutes les formes de moulage et je n'arrive pas à surmonter cet avertissement.

Même si je retire la deuxième (v2) déclaration et essayer de clone juste:

Vector<Myobject> v2 = v1.clone(); 

ou

Vector<Myobject> v2 = (Vector<Myobject>) v1.clone(); 

... obtenir encore.

Je suis sûr que je manque quelque chose ici très basique ...

Merci à l'avance

Répondre

5

Le compilateur sera toujours donner un avertissement lors de la coulée d'un non -paramétré (tel que le Object retourné par clone()) en un paramétrique. En effet, le type cible Vector<Myobject> garantit non seulement lui-même, mais aussi les objets qu'il contient. Cependant, il n'y a aucun moyen de vérifier ces garanties lors de l'exécution car les informations du paramètre de type sont effacées.

See here for a a more detailed explanation.

Comme mentionné précédemment, si vous êtes juste essayer de faire une copie du v1 vecteur, la bonne façon de le faire est d'utiliser le constructeur de copie.

Vector<Myobject> v2 = new Vector<Myobject>(v1); 

Le clone résultant sera peu profonde que cette copie que les références de Myobject v1 à v2.

+0

+1 belle réponse. eu problème avec le vecteur de clonage depuis une heure. – kjy112

+0

Sympa, mais le constructeur Vector n'est pas synchronisé, au moins dans les anciennes versions de Java. La méthode clone est synchronisée.Donc, ils ne sont pas exactement les mêmes. La plupart des cas votre solution est bien :) – Tomasz

2

Parfois, vous en tant que programmeur savez que l'avertissement est pas un problème, mais il n'y a aucun moyen pour convaincre le compilateur simplement en modifiant le code .. c'est pourquoi c'est un avertissement et non une erreur.

Dans ces cas, vous pouvez ajouter une annotation SuppressWarnings au-dessus de votre mission:

@SuppressWarnings("unchecked") 
Vector<Myobject> v2 = (Vector<Myobject>) v1.clone(); 
3

Essayez d'utiliser le constructeur de copie à la place:

Vector<Myobject> v2 = new Vector<Myobject>(v1); 
+0

Eh bien, il n'y a rien de mal avec la méthode _clone_ :) (rien que je connaisse) –

+0

clone peut avoir des résultats peu fiables (en fonction de qui a écrit l'implémentation, et quelle approche ils ont pris) beaucoup de cas et dans ce cas c'est aussi plus net. – pstanton

+0

On dirait que le constructeur de copie n'est pas synchronisé (Java 5 et plus) mais la méthode clone est. Essayez-le;) – Tomasz