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 ....
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.
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));
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.
initialiser votre vecteur comme ça
Vector<Integer> moves = new Vector<Integer>();
Utilisez de préférence Java.util.ArrayList
- c'est un remplacement de Vector
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 .