Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Type safety: Unchecked cast from Object to Vector

2 réponses
Avatar
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.

2 réponses

Avatar
Adrien Grand
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
Avatar
bloiiing
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.