web-dev-qa-db-fra.com

Java Warning using Vectors: appel non vérifié à ajouter (E)

Peu de code offensant

Vector moves = new Vector();

moves.add(new Integer(x));

Erreur:

ConnectFour.Java:82: warning: [unchecked] unchecked call to add(E) as a member of the raw type Java.util.Vector moves.add(new Integer(x));

Pas vraiment sûr de combien d'informations est nécessaire pour une erreur comme celle-ci ....

23
kylex

Le problème est que le code ci-dessus n'utilise pas génériques .

Ce qui suit fonctionnera:

Vector<Integer> moves = new Vector<Integer>();

move.add(new Integer(x));

Le nom du type dans le <> (dans le cas de Vector, le paramètre de type E pour l'élément à conserver) indique au compilateur le type d'objet auquel il doit s'attendre.

Si on essaie d'ajouter un objet du type spécifié, comme dans ce cas, essayant d'ajouter une variable String à et Vector<Integer>, une erreur de compilation se produira, indiquant qu'un type d'objet qui n'est pas du type attendu est ajouté.

Cela dit, il faut essayer de ne pas utiliser la classe Vector . Pour plus de raisons, une classe implémentant List telle que ArrayList à partir du Java Collections Framework serait suffisante et plus performante.

Modifier

Bien qu'il ne soit pas directement lié à la question des génériques, Adam Paynter a soulevé un point intéressant dans les commentaires sur l'utilisation de la boxe automatique.

Depuis Java 5, les primitives et leurs classes wrapper, par ex. int et Integer seront automatiquement convertis entre eux si nécessaire.

Par conséquent, il est possible d'ajouter une valeur spécifiée comme un int ou un littéral int dans une classe dans l'attente d'un Integer:

Vector<Integer> v = new Vector<Integer>();
v.add(5);    // Not necessary to use an Integer value.
30
coobird

Ce n'est pas une erreur, c'est juste un avertissement du compilateur. Le vecteur étant généralement paramétré, utilisez des génériques pour vous en débarrasser:

Vector<Integer> moves = new Vector<Integer>();
moves.add(new Integer(x));
4
Andreas_D

Si vous n'avez pas d'autre choix que d'utiliser la structure de données non générique, vous pouvez mettre @SuppressWarnings("unchecked") au début de la méthode pour désactiver l'avertissement.

Cela ne sera possible que si vous n'avez pas d'autre choix que d'utiliser le vecteur non générique. Cela se produit généralement lorsque vous utilisez des bibliothèques plus anciennes ou certaines parties des bibliothèques d'exécution Java.

3
James Schek
  1. initialiser votre vecteur comme ça 

    Vector<Integer> moves = new Vector<Integer>();
    
  2. Utilisez de préférence Java.util.ArrayList - c'est un remplacement de Vector

1
Bozho

Pas directement lié au code, mais c'est recommandé à utiliser (à partir de la version> = 5):

Integer.valueOf(x);

au lieu de

new Integer(x);

En effet, certaines valeurs entières {-128, ..., 127) sont cached et le même objet sera toujours renvoyé. Ceci est très utile en particulier en ce qui concerne autoboxing .

0
fikovnik