Type safety: Unchecked cast from Object to Vector

Le
bloiiing
J'ai un programme qui fonctionne parfaitement mais j'ai un warning. Pour la
beauté du jeu j'aimerais ne plus l'avoir. Est-ce que quelqu'un pourrait
m'expliquer d'où vient ce warning et comment le faire partir.

Je précise que c'est en reprenant un code qui avait été écrit avant
l'apparition des generics dans le langage java que ce warning est apparu.

Est-ce que cela provient de la méthode clone() qui renvoie un Object au lieu
d'un Vector?

Voici un morceau de mon code:

public class Exploration {

private Vector<Integer> V, V2;

public Exploration ( Vector<Integer> v ) {
this.V = ( Vector<Integer> ) v.clone(); //c'est ici le warning
}
}

Le libellé du warning est:
Type safety: Unchecked cast from Object to Vector<Integer>

Au passage si quelqu'un pouvait me le traduire ce serait sympa car je ne le
comprends pas très bien en anglais.

Merci d'avance.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Adrien Grand
Le #18648801
Bonsoir,

bloiiing a écrit :
Est-ce que cela provient de la méthode clone() qui renvoie un Object au lieu
d'un Vector?

Voici un morceau de mon code:

public class Exploration {

private Vector<Integer> V, V2;

public Exploration ( Vector<Integer> v ) {
this.V = ( Vector<Integer> ) v.clone(); //c'est ici le warning
}
}

Le libellé du warning est:
Type safety: Unchecked cast from Object to Vector<Integer>

Au passage si quelqu'un pouvait me le traduire ce serait sympa car je ne le
comprends pas très bien en anglais.



Ton compilateur te prévient simplement que tu fais un cast dont il n'a
pas la possibilité de savoir s'il est juste ou non. Avec les generics,
le compilateur peut faire des vérifications supplémentaires au moment de
la compilation. Par exemple :

List<String> l = new ArrayList<String>();
<Plein de code>
// On sait au moment de la compilation que cette affectation est valide
List<String> list = l;

List<Integer> l = new ArrayList<Integer>();
<Plein de code>
// On sait au moment de la compilation que cette affectation est
invalide -> erreur
List<String> list = l;

List l = new ArrayList();
<Plein de code>
// On ne peut pas savoir au moment de la compilation si cette
affectation est valide
// Cela dépend ce ce qu'on l'on a inséré à l'intérieur -> warning
List<String> list = new ArrayList();


Si tu souhaites faire une copie d'une collection, il est préférable
d'utiliser le constructeur qui prend une collection en argument.

Ton code devient donc :

public class Exploration {

private Vector<Integer> V, V2;

public Exploration ( Vector<Integer> v ) {
this.V = new Vector<Integer>(v); // Plus de warning
}

}

Par ailleurs, à moins que tu ne comptes partager this.V entre plusieurs
threads, il est préférable d'utiliser ArrayList puisque Vector est
synchronisé (http://java.sun.com/j2se/1.5.0/docs/api/java/util/Vector.html).

--
jpountz
bloiiing
Le #18651941
Adrien Grand wrote:

Ton code devient donc :

public class Exploration {

private Vector<Integer> V, V2;

public Exploration ( Vector<Integer> v ) {
this.V = new Vector<Integer>(v); // Plus de warning
}

}



C'est bon, ça marche. Merci.
Publicité
Poster une réponse
Anonyme